在 Python 3.7(在 Windows 64 位上測試)上,使用 RegEx 替換字符串.*會使輸入字符串重復(fù)兩次!在 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)'怎么了?如何解決?
1 回答
TA貢獻2065條經(jīng)驗 獲得超14個贊
這不是錯誤,而是來自提交fbb490fd2f38bd817d99c20c05121ad0168a38ee 的Python 3.7 中的錯誤修復(fù)。
在正則表達式中,非零寬度匹配將指針位置移動到匹配的末尾,以便下一個斷言,無論是否為零寬度,都可以從匹配之后的位置繼續(xù)匹配。因此,在您的示例中,在.*貪婪地匹配并消耗整個字符串之后,指針然后移動到字符串末尾的事實實際上仍然為該位置的零寬度匹配留下了“空間”,這可以從以下代碼在 Python 2.7、3.6 和 3.7 中的行為相同:
>>> re.findall(".*", 'sample text')
['sample text', '']
因此,關(guān)于在非零寬度匹配之后立即替換零寬度匹配的錯誤修復(fù)現(xiàn)在正確地用替換文本替換了兩個匹配。
添加回答
舉報
0/150
提交
取消