Вопрос или проблема
Регулярное выражение для поиска содержимого двойных скобок с вложенными группами двойных скобок
Я хотел бы очистить сырые данные из дампа Викисловаря. Вот два примера использования.
Многострочные:
[[Archivo:Diagrama bicicleta.svg|400px|миниатюра|'''Части велосипеда:'''<br>
[[сиденье]] или [[седло]], [[рама]]{{-sub|8}}, [[руль]], [[манеточка]]{{-sub|4}}, [[рог]], [[рукоятка]], [[телескоп]], [[вилка]], [[амортизатор]], [[тормоза]], [[ножницы]], [[колесо]], [[спицы]], [[осевой]], [[шин]]а, [[покрышка]], [[клапан]], [[педаль]], [[тяга]], [[переключатель]], [[звезда]]{{-sub|5}} или [[запчасть]], [[шестерня]], [[цепь]], [[сиденье]], [[трубка сиденья]], [[рамка]].]] + [[ что-то|конечно]]
Однострочные:
[[File:Karwats.jpg|thumb|Кнут ''(существительное {{senseno|en|whip}})'' [[exhibit#Глагол|экспонируется]] в [[museum#Существительное|музее]].]] + [[ что-то|конечно]]
В обоих случаях мне нужно извлечь только то, что находится внутри [[Archivo:xxx]]
и [[File:xxx]]
, где оба могут быть многострочными выражениями и содержать вложенный код с двойными скобками, который также нужно убрать.
Это не моя первая попытка, ха-ха, я регулярно пробую снова, но не могу сделать это самостоятельно!
Вот мой текущий регулярное выражение, которое будет совпадать со всей строкой (и в обоих примерах регулярное выражение должно оставить в покое завершающее + [[ что-то|конечно]]
).
\[\[(?:Archivo|File):(?:.|\n)+?(?=\]\])\]\]$
Спасибо за любую подсказку 🙂
Примечание: Я могу написать немного кода без использования регулярных выражений, но было бы короче найти этот волшебный шаблон!
Ответ или решение
Конечно! Давайте создадим регулярное выражение, которое будет эффективно находить содержимое в двойных скобках, включая вложенные группы. В случае ваших примеров нам нужно учитывать случаи как для многострочного, так и для однострочного текста, и избегать захвата внешнего текста, находящегося за пределами этих двойных скобок.
Ваша текущая регулярка выглядит так:
\[\[(?:Archivo|File):(?:.|\n)+?(?=\]\])\]\]$
Однако, она имеет ограничение, так как не поддерживает вложенные двойные скобки. Для этого нам нужно немного модифицировать ваше регулярное выражение.
Вот предложенное регулярное выражение:
\[\[(?:Archivo|File):((?:[^][]|\[(?:[^][]|\[(?:[^][])*\])*\])*)+?)\]\]
Давайте разберем, как оно работает:
\[\[
– соответствует открывающим двойным скобкам.(?:Archivo|File):
– соответствует словам "Archivo" или "File", за которыми следует двоеточие.((?:[^][]|\[(?:[^][]|\[(?:[^][])*\])*\])*)+?
– это основной захватывающий элемент:(?:[^][]|\[(?:[^][]|\[(?:[^][])*\])*\])*
– это позволяет захватывать любой текст, кроме закрывающих скобок, или допустимые вложенные двойные скобки.[^][]
– означает любой символ, кроме квадратных скобок.\[(?:[^][]|\[(?:[^][])*\])*\]
– позволяет захватывать вложенные двойные скобки.
\]\]
– соответствует закрывающим двойным скобкам.
Это регулярное выражение должно правильно соответствовать как многострочному, так и однострочному контенту, содержащему вложенные двойные скобки, и игнорировать текст, находящийся после завершения соответствия.
Вот пример использования:
import re
text = """
[[Archivo:Diagrama bicicleta.svg|400px|miniaturadeimagen|'''Partes de una bicicleta:'''<br>
[[asiento]] o [[sillín]], [[cuadro]]{{-sub|8}}, [[potencia]], [[puño]]{{-sub|4}}, [[cuerno]], [[manubrio]], [[telescopio]], [[horquilla]], [[amortiguador]], [[frenos]], [[tijera]], [[rueda]], [[rayos]], [[buje]], [[llanta]], [[cubierta]], [[válvula]], [[pedal]], [[viela]], [[cambio]], [[plato]]{{-sub|5}} o [[estrella]], [[piñón]], [[cadena]], [[tija]], [[tubo de asiento]], [[vaina]].]] + [[ something|of course]]
[[File:Karwats.jpg|thumb|A scourge ''(noun {{senseno|en|whip}})'' [[exhibit#Verb|exhibited]] in a [[museum#Noun|museum]].]] + [[ something|of course]]
"""
pattern = r'\[\[(?:Archivo|File):((?:[^][]|\[(?:[^][]|\[(?:[^][])*\])*\])*)+?)\]\]'
matches = re.findall(pattern, text)
for match in matches:
print(match)
Это позволит вам извлекать нужные данные из ваших текстов, игнорируя вложенные структуры двойных скобок и оставшийся контент. Если у вас есть дополнительные вопросы или необходимость в дальнейших разъяснениях, пожалуйста, дайте знать!