当'text'可能包含更多{{text}}块时,如何用re.sub()替换表达式{{text}}?

时间:2013-11-14 07:30:58

标签: python regex

我正在尝试解析原始维基百科文章内容,例如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}}

花括号递归中的花括号理论上可以任意嵌套到任意数量的级别。

如果我匹配{{.+}}的贪婪程序段,则所有内容都会从{{Infoboxeo}}匹配,包括我不想匹配的文字。

如果我匹配{{.+}}的不同意块,则{{Infoboxicon=no}}的部分匹配,{{Link GA|eo}}也是如此。但后来我留下了字符串| common_name [...] not want parsed.

我还尝试了\{\{.+(\{\{.+\}\})*.+\}\}\{\{[^\{]+(\{\{[^\{]+\}\})*[^\{]+\}\}的变体,希望只匹配较大块内的子块,但无济于事。

我列出了我尝试过的所有内容,但老实说我记不起来了,我怀疑它无论如何都有用。它总是回到同样的问题:要匹配的双卷曲末端括号}},事先需要有相同数量的{{次出现。

这是否可以使用正则表达式解决,还是需要其他解决方案?

1 个答案:

答案 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
}}