>>> d = "Batman,Superman"
>>> m = re.search("(?<!Bat)\w+",d)
>>> m.group(0)
'Batman'
为什么组(0)不匹配超人?This lookaround tutorial说:
(?前面有一个“a”,用否定的
回头看
最佳答案
在一个简单的级别上,regex引擎从字符串的左侧开始,逐渐向右移动,试图匹配您的模式(将其视为光标在字符串中移动)。在lookaround的情况下,在光标的每个停止处,lookaround都被断言,如果为true,引擎将继续尝试进行匹配。一旦引擎能匹配你的模式,它就会返回一个匹配。
在字符串的0位置(即在B
中的Batman
之前),断言成功,因为Bat
在当前位置之前不存在,因此,\w+
可以匹配整个单词Batman
(记住,正则表达式本质上是贪婪的,即将尽可能匹配)。
有关发动机内部部件的更多信息,请参见this page。
为了达到你想要的目标,你可以使用如下方法:
\b(?!Bat)\w+
在此模式中,引擎将匹配word boundary(
\b
)1,后跟一个或多个单词字符,并断言单词字符不是以Bat
开头的使用lookahead而不是lookbehind,因为在这里使用lookbehind会遇到与原始模式相同的问题;它会在单词边界正后方的位置之前进行查找,并且由于已经确定光标之前的位置是单词边界,因此负lookbehind将始终成功。注意,单词边界匹配
\w
和\W
之间的边界(即[A-Za-z0-9_]
和任何其他字符之间的边界;它也匹配^
和$
anchors)。如果你的边界需要更复杂,你需要一种不同的方式来锚定你的模式。