Регулярное выражение для поиска содержимого двойных скобок с вложенными группами двойных скобок

Вопрос или проблема

Регулярное выражение для поиска содержимого двойных скобок с вложенными группами двойных скобок

Я хотел бы очистить сырые данные из дампа Викисловаря. Вот два примера использования.

Многострочные:

[[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)

Это позволит вам извлекать нужные данные из ваших текстов, игнорируя вложенные структуры двойных скобок и оставшийся контент. Если у вас есть дополнительные вопросы или необходимость в дальнейших разъяснениях, пожалуйста, дайте знать!

Оцените материал
Добавить комментарий

Капча загружается...