如何通过Python移除被大括号包围的代码块
示例文本:字符串 -> 在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
另外,在方括号之间,你需要使用非贪婪匹配:.*?