为什么Python findall()和finditer()在unanchored。*搜索中返回空匹配?

时间:2014-09-03 15:49:16

标签: python regex

findall()finditer()的Python文档声明:

  

结果中包含空匹配,除非他们触摸了   另一场比赛的开始

这可以证明如下:

In [20]: [m.span() for m in re.finditer('.*', 'test')]
Out[20]: [(0, 4), (4, 4)]

有人可以告诉我,为什么这个模式首先会返回一个空的匹配? .*不应该使用整个字符串并返回一个匹配项吗?而且,如果我将模式锚定到字符串的开头,为什么最后没有空匹配? e.g。

In [22]: [m.span() for m in re.finditer('^.*', 'test')]
Out[22]: [(0, 4)]

1 个答案:

答案 0 :(得分:10)

  1. .* 零或更多,因此一旦消耗了四个字符,则结尾处的零长度空字符串(不会触及任何匹配的开头)仍然存在;和
  2. 末尾的空字符串与模式不匹配 - 它不会从字符串的开头开始。