【问题标题】:Python: Replace with regexPython:用正则表达式替换
【发布时间】:2011-04-29 04:36:25
【问题描述】:

我需要替换部分字符串。我正在查看 Python 文档并找到了 re.sub。

import re
s = '<textarea id="Foo"></textarea>'
output = re.sub(r'<textarea.*>(.*)</textarea>', 'Bar', s)
print output

>>>'Bar'

我希望这会打印 '&lt;textarea id="Foo"&gt;Bar&lt;/textarea&gt;' 而不是“bar”。

谁能告诉我我做错了什么?

【问题讨论】:

  • 通常的建议是不要对 HTML 使用正则表达式。这是这个网站上的一个长期回应,有一些经典的回应,最终成为这个。 stackoverflow.com/questions/1732348/…
  • 是的,考虑使用正则表达式,因为它真的很小,但改用 BeautifulSoup。

标签: python regex


【解决方案1】:

您可以捕获您想要保留的部分,而不是捕获您想要替换的部分,然后使用参考\1 引用它们以将它们包含在替换的字符串。

试试这个:

output = re.sub(r'(<textarea.*>).*(</textarea>)', r'\1Bar\2', s)

另外,假设这是 HTML,您应该考虑为此任务使用 HTML 解析器,例如 Beautiful Soup

【讨论】:

  • 我想你的意思是r'\1Bar\3'
  • 啊哈,我明白了。非常感谢马克。
  • 如前所述,最好不要解析自己的 html。但是为了完整起见,应该指出默认情况下正则表达式是贪婪的,所以在这个例子中,第一个捕获组将匹配到 last 左尖括号。如果字符串在&lt;textarea&gt; 中有标签,则这些标签将包含在匹配中。最好使用问号来防止这种情况:r'(&lt;textarea.*?&gt;).*(&lt;/textarea&gt;)'
【解决方案2】:

或者你可以直接使用搜索功能:

match=re.search(r'(<textarea.*>).*(</textarea>)', s)
output = match.group(1)+'bar'+match.group(2)
print output
>>>'<textarea id="Foo">bar</textarea>'

【讨论】:

    猜你喜欢
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    相关资源
    最近更新 更多