如何通过Python移除被大括号包围的代码块

1 投票
3 回答
4026 浏览
提问于 2025-04-15 17:20

示例文本:字符串 -> 在rev标签内的内容(通过lxml获取)。

我想要删除文本中的{{BLOCKS}}部分。

我使用了以下的正则表达式来删除简单的一行块:

p = re.compile('\{\{*.*\}\}')
nonBracketedString = p.sub('', bracketedString)

但是这并没有删除内容开头的第一个多行括号部分。怎么才能删除多行的花括号块呢?


编辑:

来自回答的解决方案:

p = re.compile('\{\{*?.*?\}\}', re.DOTALL)
nonBracketedString = p.sub('', bracketedString)

3 个回答

1

设置dotall标志——这样可以让.(点)也能匹配换行符。

p = re.compile('\{\{*.*\}\}', re.DOTALL)
nonBracketedString = p.sub('', bracketedString)
2
>>> import urllib2
>>> import re
>>> s = "".join(urllib2.urlopen('http://en.wikipedia.org/w/api.php?action=query&prop=revisions&titles=Italian%20War%20of%201542-1546&redirects&rvprop=content&format=xml').readlines())
>>> p = re.compile('\{\{.*?\}\}', re.DOTALL)
>>> re.sub(p, '', s)
'<?xml version="1.0"?><api><query><redirects><r from="Italian War of 1542-1546" to="Italian War of 1542\xe2\x80\x931546" /></redirects><pages><page pageid="3719774" ns="0" title="Italian War of 1542\xe2\x80\x931546"><revisions><rev xml:space="preserve">\n\n\n\nThe \'\'\'Italian War of 1542\xe2\x80\x9346\'\'\' was a conflict late in the [[Italian Wars]], ...

我把输出的内容缩短了,不过有足够的信息可以看出它在正常工作。

2

设置点号匹配模式。

p = re.compile('\{\{*.*?\}\}', re.DOTALL)
nonBracketedString = p.sub('', bracketedString)

在默认情况下,.这个符号可以匹配任何字符,但不包括换行符。如果你开启了DOTALL模式,它就可以匹配任何字符,包括换行符。

http://docs.python.org/library/re.html

另外,在方括号之间,你需要使用非贪婪匹配:.*?

撰写回答