Python: re(正则表达式)中的bug?还是请帮我理解我遗漏了什么

-1 投票
1 回答
37 浏览
提问于 2025-04-14 15:37

这是关于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)

撰写回答