编程语言
首页 > 编程语言> > Python正则表达式:贪婪模式返回多个空匹配

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

作者:互联网

这种模式仅意味着将字符串中的所有内容抓取到数据中第一个潜在句子边界为止:

[^\.?!\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)

Return all non-overlapping matches of pattern in string, as a list of
strings. The string is scanned left-to-right, and matches are returned
in the order found. If one or more groups are present in the pattern,
return a list of groups; this will be a list of tuples if the pattern
has more than one group. Empty matches are included in the result
unless they touch the beginning of another match.

现在,如果从左到右扫描字符串,并且*运算符是贪婪的,那么很有意义的是,返回的第一个匹配项是整个字符串,直到感叹号为止.但是,在消耗完该部分之后,我看不到该模式是如何准确产生四次空匹配的,大概是通过在“ d”之后向左扫描字符串来实现的.我确实知道*运算符表示此模式可以匹配空字符串,但我只是看不出它在尾随字母的“ d”和开头的“!”之间会多次这样做标点符号.

添加^锚具有以下效果:

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

由于这消除了空字符串匹配,因此似乎表明所述空匹配发生在字符串的前导“ A”之前.但这似乎与按照找到的顺序返回的匹配项的文档相矛盾(应该先出现前导“ A”之前的匹配项),并且再次恰好有四个空匹配项使我感到困惑.

解决方法:

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

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

如果您喜欢here,可以进一步对此进行切片/切块.

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

标签:python,regex,pattern-matching
来源: https://codeday.me/bug/20191028/1954691.html