python re sub与findall的区别

2 投票
2 回答
2610 浏览
提问于 2025-04-28 03:38

我的代码:

import urllib
import re
xml = urllib.urlopen('url').read()

我想从xml文件中删除某些标签及其内容,所以我尝试使用正则表达式。

比如:

re.findall(r'<fig(.*?)</fig>', xml, re.DOTALL)

这个可以找到匹配的内容,并且返回的结果不为空。

但是,

re.sub(r'<fig(.*?)</fig>', ' ', xml, re.DOTALL)

这个却没有任何效果,xml字符串没有改变。我很困惑,求助。

暂无标签

2 个回答

0

因为在Python中,字符串是不可改变的,所以你需要把re.sub的结果赋值给一个新的变量。如果不把它赋值给新变量,你就无法得到想要的结果。

6

re.sub这个函数的第四个参数其实不是用来设置标志的,而是用来指定替换的次数。比如在Python 2.7和3.4中,re.DOTALL的值是16,这意味着如果你写re.sub(.., re.DOTALL),它只会替换16次。

如果你把flags作为关键字参数来指定,就能解决这个问题:

re.sub(r'<fig(.*?)</fig>', ' ', xml, flags=re.DOTALL)

另外,re.sub这个函数会返回一个新的字符串,而不会直接修改第三个参数的内容。所以你要记得把这个返回值重新赋值给一个变量。

撰写回答