【问题标题】:re.sub(".*", ", "(replacement)", "text") doubles replacement on Python 3.7re.sub(\".*\", \", \"(replacement)\", \"text\") 在 Python 3.7 上加倍替换
【发布时间】:2022-11-27 07:45:07
【问题描述】:

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

怎么了?如何解决?

【问题讨论】:

标签: python python-re


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    相关资源
    最近更新 更多