正则表达式的模式,但也否定一个词

时间:2017-11-01 16:22:38

标签: regex regex-negation

是否存在不包含给定单词但正在匹配其他模式的正则表达式?

我有一个简单的模式,如下所示,用于在我正在使用的解析器中抓取单词。

field = re.compile(r"[a-zA-Z0-9]+")

解析器可以确定某个东西是变量还是函数,但是我遇到了一个问题,它抓住了使用 end 关键字的结束代码块。

    foo = 3
end if <-- end is a keyword and should not be counted as a variable

有没有办法更新正则表达式以匹配当前匹配的所有单词,除了单词结束

foo 会匹配。

en 会匹配。

结束匹配。

endx 会匹配。

1 个答案:

答案 0 :(得分:1)

在评论中@phylogenesis提供了一个有效的答案

\b(?!end\b)[a-zA-Z0-9]+

我会解释为什么/这个正则表达式如何回答你的问题。

关键是negative lookahead (?!end\b)word boundaries \b扮演着重要的支持角色。

前导\b确保您的模式从单词的开头匹配,然后负前瞻(?!end\b)仅允许模式匹配,如果单词的前三个字母不是e,n ,d后跟一个单词边界(又名“结束”一词)。这个前瞻中的单词边界确保它不会删除像'endive'这样的单词。