Python: re(正则表达式)中的bug?还是请帮我理解我遗漏了什么
这是关于Python 3.9.18的一个问题。如果下面的基本内容不是re
模块的bug,那为什么我用看起来应该是等价的代码却得到了不同的结果呢?(注意:我并不是在寻找其他实现预期结果的方法,我已经有很多这样的替代方案了):
import re
s = '{"merge":"true","from_cache":"true","html":"true","links":"false"}'
re.sub(r'"(true|false)"', r'\1', s, re.I)
'{"merge":true,"from_cache":true,"html":"true","links":"false"}'
^^^ 注意,只有第一个和第二个"true"
被替换了,而第三个和第四个仍然带着引号"
。
而下面这段代码,应该是等价的(用(?i)
代替re.I
),却按预期工作:
import re
s = '{"merge":"true","from_cache":"true","html":"true","links":"false"}'
re.sub(r'(?i)"(true|false)"', r'\1', s)
'{"merge":true,"from_cache":true,"html":true,"links":false}'
^^^ 所有的"true"
和"false"
都被替换了。
1 个回答
1
这个函数 re.sub()
的格式是这样的:
Signature: re.sub(pattern, repl, string, count=0, flags=0)
如果你把 re.I
作为第四个参数传进去,它会把这个参数当作替换次数来处理。
把 re.I
转换成整数后,它的值是2。
>>> print(int(re.I))
2
所以这样传入这个标志的话,就只会进行2次替换。
我建议你使用关键字参数来传递。
re.sub(r'"(true|false)"', r'\1', s, flags=re.I)