【问题标题】:regex for a pattern, but also negate a word [duplicate]正则表达式的模式,但也否定一个词[重复]
【发布时间】:2017-11-02 01:49:34
【问题描述】:

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

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

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

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

foo 将是匹配项。

zh 将是匹配的。

end 匹配。

endx 将是匹配项。

【问题讨论】:

  • \b(?!end\b)[a-zA-Z0-9]+ 怎么样?
  • 看起来它可以满足我的需求。谢谢!我将不得不阅读 \b。

标签: regex regex-negation


【解决方案1】:

在 cmets @phylogenesis 中提供了一个可行的答案

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

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

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

前导 \b 确保您的模式从单词的开头匹配,然后否定前瞻 (?!end\b) 仅在单词的前三个字母不是 e,n,d 后跟的情况下才允许模式匹配一个词的边界(又名“结束”这个词)。此前瞻中的单词边界确保它不会清除诸如“endive”之类的单词。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 2017-11-30
    • 2014-07-06
    • 2016-09-06
    • 2011-11-19
    • 1970-01-01
    相关资源
    最近更新 更多