如何正确使用char negation [^]来做非固定宽度的后向后看?

时间:2018-06-01 18:43:19

标签: regex pcre

我正在尝试匹配所有具有左括号的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的句子时,表达式才有效:

enter image description here enter image description here

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

2 个答案:

答案 0 :(得分:3)

在PCRE中你不能使用可变长度的lookbehind但是可以使用(*SKIP)(*FAIL)动词来使比赛失败:

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

Updated Regex Demo

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

答案 1 :(得分:0)

  

它不应与以下行匹配:(不匹配以def开头的左括号)

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

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

See demo at regex101