re.sub(".*", ", "(replacement)", "text") 在 Python 3.7 上加倍替换

re.sub(".*", ", "(replacement)", "text") doubles replacement on Python 3.7

在 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)'

怎么了?如何解决?

这不是错误,而是来自提交 fbb490fd2f38bd817d99c20c05121ad0168a38ee.

的 Python 3.7 中的错误修复

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

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

因此,关于在非零宽度匹配之后立即替换零宽度匹配的错误修复现在可以正确地用替换文本替换两个匹配。