【问题标题】:How to remove blocks surrounded by curly brackets via python如何通过python删除被大括号包围的块
【发布时间】:2010-12-29 17:49:15
【问题描述】:

示例文本:String -> rev 标记中的内容(通过 lxml)。

我正在尝试删除文本中的 {{BLOCKS}}。

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

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

但是,这不会删除内容开头的第一个多行括号部分。如何删除多行大括号块?


编辑:

答案的解决方案:

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

【问题讨论】:

标签: python regex api wikipedia


【解决方案1】:

设置 dotall 标志。

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

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

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

此外,您需要在括号之间进行非贪婪匹配:.*?

【讨论】:

  • 与 sysrqb 的结果相同。剩下的就是 [[]] 块。
【解决方案2】:

设置 dotall 标志——这允许 .匹配换行符。

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

【讨论】:

  • 当应用于提供的字符串时 -> 它似乎删除了除了最后的 [[]] 块之外的所有东西,对我来说。
【解决方案3】:
>>> 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]], ...

我已经截断了这里的输出,但足以看出它正在工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多