re.findall()不是';不像预期的那样贪婪-Python 2.7
我试图使用Python2.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 根据这一点,理论上
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()的行为。