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



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

[^.?!rn]*

输出:

>>> pattern = re.compile(r"([^.?!rn]*)")
>>> 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"^([^.?!rn]*)")
>>> matches = pattern.findall("Australians go hard!!!")
>>> print matches
['Australians go hard']

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

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

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

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

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

最新更新