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

标签 python regex

我正在尝试解析原始维基百科文章内容,例如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 ,则从 {{Infoboxeo}} 的所有内容都会匹配,包括我不想匹配的文本。

如果我匹配{{.+}}的非贪婪 block ,则从{{Infoboxicon=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/

相关文章:

python - 为什么 Python 运行 C++ 函数比 C++ 通过其 main() 函数运行自己的函数更快?

javascript - 使用 replace() 替换过多的内容

java - 匹配器在字符串末尾创建额外的组

Python C Extension + 多次调用 python 文件后崩溃。

python - 使用 python 字典和 agraph 在 Graphviz 中标记节点

regex - 仅从字符串中提取捕获组

regex - Apache RewriteRule - 无法匹配字符串的开头

正则表达式不匹配连字符后的数字

Python Treeview 滚动条

python - 为稀疏 64 位无符号整数创建最小完美哈希