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

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

如果我匹配 的贪心块{{.+}},则从{{Infoboxto匹配所有内容eo}},包括我不想匹配的文本。

如果我匹配 的不贪婪块{{.+}},则从{{Infoboxto的部分icon=no}}匹配,原样{{Link GA|eo}}。但后来我留下了字符串| common_name [...] not want parsed.

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

我会列出我尝试过的所有内容,但老实说,我不记得一半了,我怀疑它无论如何都会有多大用处。它总是回到同样的问题:为了匹配双花括号}},需要{{事先有相同的出现次数。

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

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 回答