re.findall()不是';不像预期的那样贪婪-Python 2.7

re.findall()不是';不像预期的那样贪婪-Python 2.7,python,regex,findall,Python,Regex,Findall,我试图使用Python2.7中的正则表达式从纯文本中提取完整句子的列表。就我而言,可以解释为完整句子的所有内容都应该在列表中并不重要,但列表中的所有内容都必须是完整的句子。下面是说明该问题的代码: import re text = "Hello World! This is your captain speaking." sentences = re.findall("[A-Z]\w+(\s+\w+[,;:-]?)*[.!?]", text) print sentences 根据这一点,理论上

我试图使用Python2.7中的正则表达式从纯文本中提取完整句子的列表。就我而言,可以解释为完整句子的所有内容都应该在列表中并不重要,但列表中的所有内容都必须是完整的句子。下面是说明该问题的代码:

import re
text = "Hello World! This is your captain speaking."
sentences = re.findall("[A-Z]\w+(\s+\w+[,;:-]?)*[.!?]", text)
print sentences
根据这一点,理论上,我应该得到如下列表:

>>> ["Hello World!", "This is your captain speaking."]
>>> [' World', ' speaking']
但我实际得到的结果是这样的:

>>> ["Hello World!", "This is your captain speaking."]
>>> [' World', ' speaking']
指示findall从左到右搜索,并且贪婪地处理*和+运算符。感谢您的帮助。

问题在于findall()只显示捕获的子组,而不是完整匹配。根据以下文件:

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

很容易看到正在使用和探索的内容:

问题的解决方案是使用
?:
抑制子组。然后您将得到预期的结果:

>>> re.findall("[A-Z]\w+(?:\s+\w+[,;:-]?)*[.!?]", text)
['Hello World!', 'This is your captain speaking.'

您可以稍微更改您的正则表达式:

>>> re.findall(r"[A-Z][\w\s]+[!.,;:]", text)
['Hello World!', 'This is your captain speaking.']

将捕获组与re.findall一起使用时,它只返回捕获集,而不返回整个匹配。将捕获组
(…)
更改为非捕获组
(?:…)
。(第一个
\w+
\w*
)。你的问题与贪婪无关。是的,这很有效。谢谢。这不是一个完全相同的。在这个问题中,有一个令人困惑的问题,即原始字符串中的双转义
\\
。这个问题更清楚地触及了单个问题的核心,即给定捕获组时re.findall()的行为。