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. 使用JAVA的串行化打造自己的“对象数据库”2. 在 PHP 中用描点法“绘制”中文3. 以一行JS代码将PC网站移动化,想成为PaaS的“云适配”试图以简化方式做跨屏适配4. 为什么从类内部访问类变量需要“自我”。在Python中?5. 在Python中,“。append()”和“ + = []”之间有什么区别?6. Python量化交易实战之使用Resample函数转换“日K”数据7. 从Python的字符串中剥离所有非数字字符(“。”除外)8. ASP中解决“对象关闭时,不允许操作。”的诡异问题……9. 如何解决错误“错误:命令错误,退出状态1:python。” 尝试使用pip安装django-heroku时10. set rs=conn.execute,set rs=server.createobject(“ADODB.recordset”)的性能对比

网公网安备