我正在尝试匹配所有具有左括号的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的句子时,表达式才有效:
答案 0 :(得分:3)
在PCRE中你不能使用可变长度的lookbehind但是可以使用(*SKIP)(*FAIL)
动词来使比赛失败:
def[^(]*\((*SKIP)(*F)|\(
(*FAIL)
表现得像一个失败的否定断言,是(?!)
(*SKIP)
定义了一个点,当子模式稍后失败时,不允许正则表达式引擎回溯(*SKIP)(*FAIL)
一起提供了一个很好的限制替代方案,在上面的正则表达式中你不能有一个可变长度的lookbehind。答案 1 :(得分:0)
它不应与以下行匹配:(不匹配以def开头的左括号)
您可以在每行^
开头使用否定lookahead断言来检查您的情况:
^(?![^\n(]*?def)[^\n(]*\(
negated class [^\n(]
匹配除换行符和左括号之外的任何字符
要从匹配前放弃(
之前的部分,请使用\K
进行重置:^(?![^\n(]*?def)[^\n(]*+\K\(
在def
的开头/结尾使用word boundaries \b
,如果希望将子字符串匹配为单词