re.sub(“。*”,“,”(replacement)“,” text“)在Python 3.7上的替换次数翻倍

时间:2019-02-15 16:40:13

标签: python python-regex

在Python 3.7(在Windows 64位上测试)上,使用RegEx .*替换字符串会使输入字符串重复两次!

在Python 3.7.2上:

>>> import re
>>> re.sub(".*", "(replacement)", "sample text")
'(replacement)(replacement)'

在Python 3.6.4上:

>>> import re
>>> re.sub(".*", "(replacement)", "sample text")
'(replacement)'

在Python 2.7.5(32位)上:

>>> import re
>>> re.sub(".*", "(replacement)", "sample text")
'(replacement)'

怎么了?该如何解决?

1 个答案:

答案 0 :(得分:14)

这不是错误,而是来自提交fbb490fd2f38bd817d99c20c05121ad0168a38ee的Python 3.7中的错误修复。

在正则表达式中,非零宽度的匹配将指针位置移动到匹配的末尾,以便下一个断言(无论是否为零宽度)都可以从匹配之后的位置继续进行匹配。因此,在您的示例中,.*贪婪地匹配并消耗了整个字符串之后,指针随后移到字符串末尾的事实实际上仍然为该位置的零宽度匹配留有“余地”,例如从以下代码中可以明显看出,它们在Python 2.7、3.6和3.7中的行为相同:

>>> re.findall(".*", 'sample text')
['sample text', '']

因此,该错误修复程序是在非零宽度匹配之后立即替换零宽度匹配,现在可以用替换文本正确替换两个匹配。