【问题标题】:Python regular expression findall *Python 正则表达式 findall *
【发布时间】:2015-08-13 15:54:15
【问题描述】:

我无法理解以下代码行为。

>>> import re
>>> text = 'been'
>>> r = re.compile(r'b(e)*')
>>> r.search(text).group()
'bee' #makes sense
>>> r.findall(text)
['e'] #makes no sense

我阅读了一些关于捕获组和所有内容的现有问题和答案。但我仍然很困惑。有人可以解释一下吗。

【问题讨论】:

  • 您阅读过re.search 与re.findall 的文档吗?他们做不同的事情......
  • 如果你不正确地使用其中一个,猫就会死在世界的某个地方。

标签: python regex findall


【解决方案1】:

答案简化在Regex Howto

如您所见here,group 返回正则表达式匹配的字符串。

group() 返回由 RE 匹配的子字符串。

但是findall的动作在documentation中是有道理的

如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表

所以你得到了捕获组的匹配部分。

一些实验包括:

>>> r = re.compile(r'(b)(e)*')
>>> r.findall(text)
[('b', 'e')]

这里的正则表达式有两个捕获组,因此返回值是匹配组的列表(以元组形式)

【讨论】:

    【解决方案2】:

    当模式包含捕获组时,findall 仅返回捕获组的内容,不再返回整个匹配项。

    如果这种行为看起来很奇怪,那么在特定上下文(之前或之后的子字符串)中轻松提取字符串的一部分可能非常有用,特别是因为 python re 模块不支持可变长度的lookbehinds。

    【讨论】:

      猜你喜欢
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      • 1970-01-01
      • 2013-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多