这种模式仅意味着将字符串中的所有内容抓取到数据中第一个潜在句子边界为止:
[^\.?!\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(模式,字符串,标志= 0) 返回字符串中模式的所有非重叠匹配项,作为字符串列表。从左到右扫描字符串,并以找到的顺序返回匹配项。如果模式中存在一个或多个组,则返回一个组列表;否则,返回一个列表。如果模式包含多个组,则这将是一个元组列表。空匹配项将包括在结果中,除非它们碰到另一个匹配项的开头。
re.findall(模式,字符串,标志= 0)
返回字符串中模式的所有非重叠匹配项,作为字符串列表。从左到右扫描字符串,并以找到的顺序返回匹配项。如果模式中存在一个或多个组,则返回一个组列表;否则,返回一个列表。如果模式包含多个组,则这将是一个元组列表。空匹配项将包括在结果中,除非它们碰到另一个匹配项的开头。
现在,如果从左到右扫描字符串,并且运算符是贪婪的,那么很有意义的是,返回的第一个匹配项是整个字符串,直到感叹号为止。但是,在消耗完该部分之后,我看不到该模式如何准确地产生四次空匹配,大概是通过在“ d”之后向左扫描字符串来实现的。我确实知道运算符意味着该模式可以匹配空字符串,但我只是看不出它在字母的后缀“ d”和前导“!”之间会多次执行该操作。标点符号。
添加^锚具有以下效果:
>>> pattern = re.compile(r"^([^\.?!\r\n]*)") >>> matches = pattern.findall("Australians go hard!!!") >>> print matches ['Australians go hard']
由于这消除了空字符串匹配,因此似乎表明所述空匹配发生在字符串的前导“ A”之前。但这似乎与按照找到的顺序返回的匹配项的文档相矛盾(应该先出现前导“ A”之前的匹配项),而且,恰好有四个空匹配项使我感到困惑。
的*量词允许捕获长度为零的子串的图案。在您的原始代码版本中(^前面没有锚),其他匹配项是:
*
^
hard
!
如果您喜欢这里,可以进一步切片/切块。
^现在,将锚添加到最前面可以确保只有一个子字符串可以匹配该模式,因为输入文本的开头恰好发生一次。