如何正确使用字符否定 [^ ] 来做单词非固定宽度向后回顾?

How to properly use char negation [^ ] to do word non-fixed width backward lookbehind?

我正在尝试匹配所有 Python 带有左括号的源代码行,但它不是函数定义。基本上,匹配所有函数调用,但不匹配函数定义。

我正在解析 Python 源代码,但我只有 PCRE 引擎,而不是具有非固定宽度后视的新 Javascript。如果句子在匹配之前的任何地方 (.*) 前面有单词 def,我将尝试不匹配。

这个正则表达式做了一半:

(?:^)(?:[^d][^e][^f])+\(

它不应匹配具有以下内容的行:(不匹配以 def 开头的左括号)

anything def anything(thing)
anyyything def anythinggg(thing)

并且只匹配以下行:(匹配前面除了 def 以外的任何内容的左括号)

anything anything(thing)
anyyything anythinggg(thing)

但是它有一个问题,就像我做的那样 (?:[^d][^e][^f])+,只有当左括号 ( 前面有一个长度为 3 的倍数的句子时,该表达式才有效:

  1. https://regex101.com/r/ec0FgD/1 - 实例

在 PCRE 中,您不能使用可变长度后视,但可以使用 (*SKIP)(*FAIL) 动词使匹配失败:

def[^(]*\((*SKIP)(*F)|\(

Updated Regex Demo

  • (*FAIL) 表现得像一个失败的否定断言,是 (?!)
  • 的同义词
  • (*SKIP) 定义一个点,当子模式稍后失败时,正则表达式引擎不允许回溯超过该点
  • (*SKIP)(*FAIL) 一起提供了一个很好的限制替代方案,你不能在上面的正则表达式中有可变长度的回顾。

It should not match lines with: (not match an open parenthesis preceded by def)

您可以在每行的 ^ 开头使用否定 lookahead 断言来检查您的条件:

^(?![^\n(]*?def)[^\n(]*\(

See demo at regex101