在Python3.7上,re.sub(“*”、“替换”)、“文本”将替换加倍

在Python3.7上,re.sub(“*”、“替换”)、“文本”将替换加倍,python,re,Python,Re,在Python 3.7(在Windows 64位上测试)上,使用RegEx*替换字符串会使输入字符串重复两次 在Python 3.7.2上: >>重新导入 >>>关于子条款(“*”、“(替换)”、“示例文本”) "(替换)(替换)" 在Python 3.6.4上: >>重新导入 >>>关于子条款(“*”、“(替换)”、“示例文本”) "(更换)" 在Python 2.7.5(32位)上: >>重新导入 >>>关于子条款(“*”、“(替换)”、“示例文本”) "(更换)" 怎么了?如何修复它

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

在Python 3.7.2上:

>>重新导入
>>>关于子条款(“*”、“(替换)”、“示例文本”)
"(替换)(替换)"
在Python 3.6.4上:

>>重新导入
>>>关于子条款(“*”、“(替换)”、“示例文本”)
"(更换)"
在Python 2.7.5(32位)上:

>>重新导入
>>>关于子条款(“*”、“(替换)”、“示例文本”)
"(更换)"

怎么了?如何修复它?

这不是一个bug,而是Python 3.7中从提交开始的bug修复

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

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

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

显然是一个错误。不确定您希望得到什么样的答案。只在
*
(或
*$
)中出现,而不是在
+
^.*
中出现。而且,在匹配结束时,有无限多个零字节字符串,因此您最好只得到一个重复。:)看起来这是故意的改变:@aranfey,因为
*
是贪婪的,所以我只希望得到一次“(替换)”。为什么是两个?这真的是Python中的一个bug吗?就连这些人的行为也完全一样。还请注意,在regex101上的行为也相同,但它们也可以使用
3.7.2
。。。奇怪的是,如果里面什么都没有,那么替换只会发生一次。我猜字符串
^
的开头和
$
的结尾算两个空格字符?