14

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

怎么了?如何解决?

4

1 回答 1

18

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

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

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

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

于 2019-02-15T17:42:44.913 回答