当前位置: 首页 > 面试题库 >

re.sub(“。*”,“,”(replacement)“,“ text”)在Python 3.7上的替换次数翻倍

扈运浩
2023-03-14
问题内容

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

怎么了?如何解决?


问题答案:

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

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

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

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



 类似资料:
  • 问题内容: 我想为re.sub提供替代的替换模式。 假设我有两种搜索模式可供选择,如下所示: 而不是提供一个替换模式,我想以某种方式捕获匹配哪个搜索模式的替换项并提供替换模式。这可能吗?谢谢。 PS。这里的代码细节无关紧要,这是一个普遍的问题。 问题答案: 您可以将函数传递给。在该函数中,您可以根据捕获的组返回所需的值。一个简单的代码说明: 该函数检查匹配是否成功,并根据捕获的组返回替换字符串。如

  • 问题内容: 为了掌握Python中的正则表达式,我试图输出一些在URL中突出显示的HTML。我的输入是 我的输出应该是 如果我用Java语言执行此操作 我得到了期望的结果,但是如果我在Python中这样做 我没有,如何让Python返回正确的结果而不是?这样做是否正确? 问题答案: 只需使用代替: 另请注意,将原始字符串()用于正则表达式。它不是强制性的,但消除了转义反斜杠的需要,可以说使代码更具

  • 然后我试着这样称呼它。 不幸的是,修改URL编码路径替换后,我最终请求而不是。是否有任何方法可以禁用路径替换的URL编码或跨多个路径段进行替换?不幸的是,我甚至不知道有多少路径段,它都是由API控制的。

  • 问题内容: 我有以下字符串 我正在尝试这样做 如何逃避试图连接到mystr1的反斜杠? 问题答案: 您需要一个四倍的反斜杠: 原因: 正则表达式以匹配单个反斜杠: 用于描述此正则表达式的字符串:。 或者,您可以使用原始字符串,因此只需要双反斜杠即可:

  • 问题内容: 我是python的新手 我需要用一个正则表达式匹配所有情况并进行替换。这是一个示例子字符串->所需结果: 我想在我的代码中做到这一点: 而不是替换完之后的所有内容,它替换了所有内容并返回 re.sub是否有办法仅替换捕获组而不是整个模式? 问题答案: 您可以使用替换组: 注意,我将第一组(要保留的组)放在括号中,然后通过在替换字符串中使用修饰符(第一组)将其保留在输出中。

  • 问题内容: 我正在尝试替换文件列表中的部分文件扩展名。我希望能够遍历项目(文件)并删除扩展名。我不知道当re.sub作为第三个参数需要一个字符串时,如何适当地遍历列表中的项目。例如。re.sub(pattern,repl,string,count = 0,标志= 0) 这里出现的问题是re.sub需要一个字符串,而我希望它在字符串列表中循环。 感谢您的任何建议! 问题答案: 您可以使用列表推导来使