re.sub(“。*”,“,”(replacement)“,“ text”)在Python 3.7上的替換次數翻倍
這不是一個錯誤,而是來自提交fbb490fd2f38bd817d99c20c05121ad0168a38ee的Python3.7中的錯誤修復。
在正則表達式中,非零寬度的匹配將指針位置移動到匹配的末尾,以便下一個斷言(無論是否為零寬度)都可以從匹配之后的位置繼續進行匹配。因此,在您的示例中,在.*貪婪地匹配并消耗了整個字符串之后,指針隨后移至字符串末尾的事實實際上仍然為該位置的零寬度匹配留有“余地”,這可以從以下代碼,在Python2.7、3.6和3.7中的行為相同:
>>> re.findall('.*', ’sample text’)[’sample text’, ’’]
因此,該錯誤修復程序是在非零寬度匹配之后立即替換零寬度匹配,現在可以用替換文本正確替換兩個匹配。
解決方法在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('.*','sample text')’(replacement)’
在Python 2.7.5(32位)上:
>>> import re>>> re.sub('.*','sample text')’(replacement)’
怎么了?如何解決?
相關文章:
1. 解決啟動django,瀏覽器顯示“服務器拒絕訪問”的問題2. set rs=conn.execute,set rs=server.createobject(“ADODB.recordset”)的性能對比3. php讓json_encode不自動轉義斜杠“/”的方法4. 感覺PHP的最佳實踐就是“數組編程”5. Python量化交易實戰之使用Resample函數轉換“日K”數據6. $.ajax中contentType: “application/json” 的用法詳解7. 為什么python為什么在“。”之后的對象和方法名稱之間要留空格?8. Python 3.5:“與...同步”會導致SyntaxError。為什么?[重復]9. python爬取”頂點小說網“《純陽劍尊》的示例代碼10. 以一行JS代碼將PC網站移動化,想成為PaaS的“云適配”試圖以簡化方式做跨屏適配
