Python正则表达式:贪婪模式返回多个空匹配

时间:2015-01-24 04:20:39

标签: python regex pattern-matching

这种模式只是为了抓住字符串中的所有内容,直到数据中的第一个潜在句子边界:

[^\.?!\r\n]*

输出:

>>> pattern = re.compile(r"([^\.?!\r\n]*)")
>>> matches = pattern.findall("Australians go hard!!!") # Actual source snippet, not a personal comment about Australians. :-)
>>> print matches
['Australians go hard', '', '', '', '']

来自Python文档:

  

re.findall(pattern,string,flags = 0)

     

返回字符串中所有非重叠的模式匹配,作为列表   字符串。从左到右扫描字符串,并返回匹配项   按顺序找到。如果模式中存在一个或多个组,   返回一个组列表;如果模式,这将是一个元组列表   有不止一个团体。结果中包含空匹配   除非他们触及另一场比赛的开始。

现在,如果从左到右扫描字符串并且*运算符是贪婪的,那么返回的第一个匹配就是整个字符串直到感叹号,这是完全合理的。然而,在该部分被消耗之后,我没有看到该模式如何正好产生四次空匹配,可能是通过在“d”之后向左扫描字符串。我明白*运算符意味着这个模式可以匹配空字符串,我只是看不到它在字母的尾随“d”和前导“!”之间不止一次这样做。标点符号。

添加^锚具有此效果:

>>> pattern = re.compile(r"^([^\.?!\r\n]*)")
>>> matches = pattern.findall("Australians go hard!!!")
>>> print matches
['Australians go hard']

由于这消除了空字符串匹配,它似乎表明所述空匹配发生在字符串的前导“A”之前。但是这似乎与关于在找到的顺序中返回的匹配的文档相矛盾(在前面的“A”应该是第一个之前的匹配),并且再次恰好四个空匹配让我困惑。

1 个答案:

答案 0 :(得分:4)

*量词允许模式捕获长度为零的子字符串。在原始代码版本中(前面没有^锚点),其他匹配项为:

  • hard的结尾与第一个!
  • 之间的零长度字符串
  • 第一个和第二个!
  • 之间的零长度字符串
  • 第二个和第三个!
  • 之间的零长度字符串
  • 第三个!和文本末尾之间的零长度字符串

如果您喜欢here,可以进一步切片/切块。

现在将^锚点添加到前面可以确保只有一个子字符串可以匹配模式,因为输入文本的开头只出现一次。