2009-12-24 79 views
1

示例文本:String - > rev标签中的内容(通过lxml)。如何通过python删除花括号包围的块

我试图删除文本中的{{BLOCKS}}。

我用下面的正则表达式来去除简单,一行块:

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

然而,这并不在内容的开头删除第一多行括号中的部分。如何删除多行大括号内的块?


编辑:从答案

解决方案:

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

嗯 - >刚刚发现点不符合新行:http://www.regular-expressions.info/dot.html – torger

回答

2

设置dotall标志。

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

在默认模式下,.与除换行符以外的任何字符匹配。如果已经指定了DOTALL标志,则它匹配包括换行符的任何字符。

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

此外,你需要括号之间的非贪婪匹配:.*?

+1

与sysrqb的结果相同。只剩下[[]]块。 – torger

1

设置DOTALL flag--这允许。以匹配换行符。

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

当应用于提供的字符串 - >它似乎删除除了对于最后的[[]]块,对我来说。 – torger

1
>>> 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]], ... 

我在这里截断的输出,但有足以看出它的工作。