1

を使用して、未加工のウィキペディアの記事コンテンツ、たとえばスウェーデンの記事を解析しようとしていre.sub()ます。{{some text}}ただし、 のブロックをさらにブロックに含めることができるため、のブロックを置換しようとすると問題が発生し{{some text}}ます。

以下は、上記の記事の省略された例です。

{{Infobox country
| conventional_long_name = Kingdom of Sweden
| native_name = {{native name|sv|Konungariket Sverige|icon=no}}
| common_name = Sweden
}}
Some text I do not want parsed.
{{Link GA|eo}}

中括弧の再帰内の中括弧は、理論的には任意の数のレベルにネストできます。

の貪欲なブロックに一致すると、一致させたくないテキストを含め、からまでの{{.+}}すべてが一致します。{{Infoboxeo}}

の貪欲でないブロックにマッチすると、 からまで{{.+}}の部分がそのままマッチします。しかし、私は文字列が残っています{{Infoboxicon=no}}{{Link GA|eo}}| common_name [...] not want parsed.

大きなブロック内のサブブロックのみを一致させることを期待して、 と のバリアントも試しましたが、役に立ちませんでし\{\{.+(\{\{.+\}\})*.+\}\}た。\{\{[^\{]+(\{\{[^\{]+\}\})*[^\{]+\}\}

私が試したことをすべて挙げたいと思いますが、正直なところ、半分は覚えていません。常に同じ問題に戻ってきます: 二重中括弧が一致するには、事前}}に同じ数の出現が必要であるということです。{{

これは正規表現を使用しても解決できますか、それとも別の解決策が必要ですか?

4

1 に答える 1

2

検討しましたmwparserfromhellか?

import mwparserfromhell
s = """{{Infobox country
| conventional_long_name = Kingdom of Sweden
| native_name = {{native name|sv|Konungariket Sverige|icon=no}}
| common_name = Sweden
}}
Some text I do not want parsed.
{{Link GA|eo}}"""
wikicode = mwparserfromhell.parse(s)
print wikicode.filter_templates()[0]

版画:

{{Infobox country
| conventional_long_name = Kingdom of Sweden
| native_name = {{native name|sv|Konungariket Sverige|icon=no}}
| common_name = Sweden
}}
于 2013-11-14T07:40:37.507 に答える