python re sub与findall的区别
我的代码:
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
这个函数会返回一个新的字符串,而不会直接修改第三个参数的内容。所以你要记得把这个返回值重新赋值给一个变量。