re.sub:非贪婪没有按预期工作

时间:2016-10-05 08:37:59

标签: python regex

我在ipython中有以下代码。我希望它能删除开头的" ab"从那以后。*?是一个非贪婪的人。但为什么它一直移到最后一个b?

  In [15]: b="abcabcabc"

  In [16]: re.sub(".*?b","",b)
  Out[16]: 'c'

2 个答案:

答案 0 :(得分:3)

这是因为,默认情况下,re.sub()会搜索并替换所有匹配项

>>> import re
>>> b="abcabcabc"
>>> re.sub(".*?b","",b)
'c'
>>> re.sub("^.*?b","",b)
'cabcabc'
>>> re.sub(".*?b","",b, count=1)
'cabcabc'
>>> re.sub(".*?b","",b, count=2)
'cabc'


来自doc

re.sub(pattern, repl, string, count=0, flags=0)

答案 1 :(得分:1)

python docs说:

  

可选参数count是要替换的模式最大出现次数; count必须是非负整数。如果省略或为零,则将替换所有出现的内容

因此,您可以使用re.sub致电count=1以获得所需的结果:

re.sub(".*?b", "", b, 1)
#output
'cabcabc'