ネストされた構造に一致させるために、一部の正規表現方言はのような再帰パターンを提供します(?R)
。(?R)
基本的には「この表現が一致するもの」と書いてあります。
標準のPythonre
はこれをサポートしていませんが、最終的には置き換えられる新しい正規表現re
モジュールはサポートしています。これが完全な例です。
text = """
{{some text}}
some other text
{{Infobox President
birth|d/m/y
other_inner_text:{{may contain {curly} bracket}}
other text}}
some other text
or even another infobox
{{Infobox Cabinet
same structure
{{text}}also can contain {{}}
}}
can be some other text...
"""
import regex
rx = r"""
{{ # open
( # this match
(?: # contains...
[^{}] # no brackets
| # or
}[^}] # single close bracket
| # or
{[^{] # single open bracket
| # or
(?R) # the whole expression once again <-- recursion!
)* # zero or more times
) # end of match
}} # close
"""
rx = regex.compile(rx, regex.X | regex.S)
for p in rx.findall(text):
print 'FOUND: (((', p, ')))'
結果:
FOUND: ((( some text )))
FOUND: ((( Infobox President
birth|d/m/y
other_inner_text:{{may contain {curly} bracket}}
other text )))
FOUND: ((( Infobox Cabinet
same structure
{{text}}also can contain {{}}
)))
再帰的な正規表現の優れた説明については、このブログエントリを参照してください。
(これを盗むことに抵抗できませんでした)。
そうは言っても、パーサーベースのソリューションを使用したほうがよいでしょう。たとえば、ネストされた式をpyparsingで解析するを参照してください。