我正在尝试解析原始维基百科文章内容,例如the article on Sweden,使用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}}
花括号递归中的花括号理论上可以任意嵌套到任意数量的级别。
如果我匹配{{.+}}
的贪婪程序段,则所有内容都会从{{Infobox
到eo}}
匹配,包括我不想匹配的文字。
如果我匹配{{.+}}
的不同意块,则{{Infobox
到icon=no}}
的部分匹配,{{Link GA|eo}}
也是如此。但后来我留下了字符串| common_name [...] not want parsed.
我还尝试了\{\{.+(\{\{.+\}\})*.+\}\}
和\{\{[^\{]+(\{\{[^\{]+\}\})*[^\{]+\}\}
的变体,希望只匹配较大块内的子块,但无济于事。
我列出了我尝试过的所有内容,但老实说我记不起来了,我怀疑它无论如何都有用。它总是回到同样的问题:要匹配的双卷曲末端括号}}
,事先需要有相同数量的{{
次出现。
这是否可以使用正则表达式解决,还是需要其他解决方案?
答案 0 :(得分: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
}}