我正在尝试解析原始维基百科文章内容,例如the article on Sweden ,使用re.sub()
。但是,我在尝试替换 {{some text}}
block 时遇到了问题,因为它们可以包含更多的 {{some text}}
block 。
以下是上述文章中的一个简短示例:
{{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}}
大括号内的大括号递归理论上可以任意嵌套到任意数量的级别。
如果我匹配 {{.+}}
的贪婪 block ,则从 {{Infobox
到 eo}}
的所有内容都会匹配,包括我不想匹配的文本。
如果我匹配{{.+}}
的非贪婪 block ,则从{{Infobox
到icon=no}}
的部分已匹配,{{Link GA|eo}}
也是如此。但后来我留下了字符串 | common_name [...] 不想解析。
我还尝试了 \{\{.+(\{\{.+\}\})*.+\}\}
和 \{\{[^\{]+(\{\{[^\{]+\}\})*[^\{]+\}\}
,希望仅匹配较大块内的子 block ,但没有效果。
我会列出我尝试过的所有内容,但老实说我记不起一半,而且我怀疑它会有多大用处。它总是会回到同样的问题:为了使双花括号 }}
匹配,需要事先出现相同数量的 {{
。
这是否可以使用正则表达式来解决,还是我需要其他解决方案?
最佳答案
您考虑过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
}}
关于python - 当 'text' 可能包含更多 {{ text }} block 时,如何用 re.sub() 替换表达式 {{ text }} ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19971991/