这种模式只是为了抓住字符串中的所有内容,直到数据中的第一个潜在句子边界:
[^\.?!\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”应该是第一个之前的匹配),并且再次恰好四个空匹配让我困惑。
答案 0 :(得分:4)
*
量词允许模式捕获长度为零的子字符串。在原始代码版本中(前面没有^
锚点),其他匹配项为:
hard
的结尾与第一个!
!
!
!
和文本末尾之间的零长度字符串如果您喜欢here,可以进一步切片/切块。
现在将^
锚点添加到前面可以确保只有一个子字符串可以匹配模式,因为输入文本的开头只出现一次。