代码之家  ›  专栏  ›  技术社区  ›  Laurent LAPORTE

重新。sub(“.*”、“,”(replacement)”、“text”)在Python 3.7上加倍替换

  •  0
  • Laurent LAPORTE  · 技术社区  · 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位)上:

    >>>导入re
    &燃气轮机&燃气轮机&燃气轮机;重新。sub(“.*”,“替换)”,“示例文本”)
    “(替换)”
    

    怎么了?如何解决这个问题?

    0 回复  |  直到 5 年前
        1
  •  20
  •   blhsing    7 年前

    这不是一个bug,而是Python 3.7中提交的bug修复 fbb490fd2f38bd817d99c20c05121ad0168a38ee .

    在regex中,非零宽度匹配将指针位置移动到匹配的末尾,以便下一个断言(零宽度与否)可以从匹配后的位置继续匹配。在你的例子中 .* 贪婪地匹配并消耗整个字符串,指针随后移动到字符串末尾的事实实际上仍然为该位置的零宽度匹配留下了“空间”,从以下代码中可以明显看出,Python 2.7、3.6和3.7中的行为相同:

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

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