Python:使用正则表达式进行替换

47

我需要替换一个字符串的一部分。我查阅了Python文档,并找到了re.sub函数。

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

>>>'Bar'

我本来期望它会输出'<textarea id="Foo">Bar</textarea>'而不是'bar'。

请问有人能告诉我我做错了什么吗?


3
通常建议不要使用正则表达式来处理HTML。这是该网站上长期以来的回答,有一些经典的回复,其中包括这个https://dev59.com/X3I-5IYBdhLWcg3wq6do#1732454。 - hughdbrown
是的,我本来想使用正则表达式,因为它只是一个很小的部分,但最后改用了BeautifulSoup。 - Pickels
2个回答

80

不要捕获你想要替换的部分,而是捕获你想要保留的部分,然后使用引用\1来引用它们并将它们包含在替换后的字符串中。

请尝试这个方法:

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

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


我认为你的意思是 r'\1Bar\3' - nmichaels
3
如前所述,最好不要解析自己的HTML。但为了完整起见,应指出默认情况下正则表达式是贪婪的,因此在这个例子中,第一个捕获组将匹配到最后一个开放的角括号。如果字符串中包含在<textarea>标记中的标签,则它们将被包含在匹配项内。更好的做法是使用问号防止这种情况: r'(<textarea.*?>).*(</textarea>)' - Jonathan Cross

3
或者您可以使用搜索功能代替:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接