【问题标题】:Why do Python findall() and finditer() return empty matches on unanchored .* searches?为什么 Python findall() 和 finditer() 在未锚定的 .* 搜索中返回空匹配?
【发布时间】:2014-10-28 05:00:11
【问题描述】:

findall()finditer() 的 Python 文档指出:

空匹配项包含在结果中,除非它们触及 另一场比赛的开始

这可以证明如下:

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)]

【问题讨论】:

  • 起始锚定模式曾经怎么能匹配到最后的东西?

标签: python regex


【解决方案1】:
  1. .*零个或多个,所以一旦四个字符被消耗,最后的零长度空字符串(不触及任何匹配的开头)仍然存在;和
  2. 末尾的空字符串与模式不匹配 - 它不在字符串的开头。

【讨论】:

  • 没错,用.+试试这个
  • 啊哈!现在这一切似乎都那么明显。非常感谢!
  • 您甚至可以将此行为用于非贪婪匹配以在字符前后添加空字符串,例如:re.findall(r".*?", "foo") 将导致 ['', 'f', '', 'o', '', 'o', '']。我不知道它是做什么用的,但它是一个很好的单线。 :)
猜你喜欢
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
  • 2020-05-26
  • 1970-01-01
相关资源
最近更新 更多