1

ウィキペディアからインフォボックスブロックを抽出したい。以下はサンプル入力ファイルです。

{{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...

解析結果が2つのInfoboxブロックを返すようにしたい:

{{Infobox President
birth|d/m/y
other_inner_text:{{may contain curly bracket}}
other text
}}

{{Infobox Cabinet
same structure
{{text}}also can contain {{}}
}}

これを実現するためにPythonで正規表現を使用する方法を知っている人はいますか?

4

3 に答える 3

2

ネストされた構造に一致させるために、一部の正規表現方言はのような再帰パターンを提供します(?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で解析するを参照してください。

于 2012-05-20T23:18:55.600 に答える
1

Pythonではありませんが、この回答が役立つ場合があります。1レベルのネストされたテンプレートを処理できる(迅速ではないがダーティな)正規表現も含まれています。

一般的な答えはノーです。正規表現はネストされた構造を解析できません。mediawiki apiから解析ツリーを取得する方法については、リンクされた回答を参照してください。

于 2012-05-20T21:58:48.793 に答える
1

正規表現

{{Infobox(?:(?!}}|{{).)*(?:{{(?:(?!}}|{{).)*}}(?:(?!}}|{{).)*)*.*?}}

そして、私が流暢ではないPerlでの私の試み

while ($subject =~ m/\{\{Infobox(?:(?!\}\}|\{\{).)*(?:\{\{(?:(?!\}\}|\{\{).)*\}\}(?:(?!\}\}|\{\{).)*)*.*?\}\}/sg) {
    # matched text = $&
}

バランスが取れている限り、無制限の「{{sometext}}」のペアで機能します。そのペアのネストされたテキストはサポートされていませんが、必須ではありませんでした。

これが1回限りのソリューションで使用されない場合は、代替ソリューションを探す方がよい場合があることに注意してください。このような正規表現を維持することは残酷です。

于 2012-05-20T22:19:13.327 に答える