为什么Python的findall()和finditer()在未锚定的.*搜索中返回空匹配?
Python文档中关于findall()
和finditer()
的说明是:
空匹配会被包含在结果中,除非它与另一个匹配的开头相接触。
这个可以通过以下方式来演示:
In [20]: [m.span() for m in re.finditer('.*', 'test')]
Out[20]: [(0, 4), (4, 4)]
不过,有谁能告诉我,为什么这个模式一开始就会返回一个空匹配呢?难道.*
不应该消耗掉整个字符串并返回一个完整的匹配吗?而且,如果我把模式固定在字符串的开头,为什么最后没有空匹配呢?比如:
In [22]: [m.span() for m in re.finditer('^.*', 'test')]
Out[22]: [(0, 4)]
1 个回答
14
.*
表示“零个或多个”,所以当前面的四个字符被处理完后,最后的空字符串(这个空字符串并没有和任何匹配的开始部分接触)仍然存在;- 最后的空字符串并不符合这个模式——它并没有从字符串的开头开始。