查找没有其他字符串开头的字符串


问题内容

我只想在['bar']这里得到:

>>> re.findall(r"(?<!\bdef )([a-zA-Z0-9.]+?)\(", "def foo(): bar()")
['oo', 'bar']

在单个正则表达式中有可能吗?如果没有,我将首先使用它:re.sub(r"\bdef [a-zA-Z0-9.]+", "", "def foo(): bar()")


问题答案:

当前的regex匹配oo于,foo因为oo(之前没有"def "

要阻止单词中的模式匹配,可以使用单词边界,\b其修复方法可能类似于r"\b(?<!\bdef )([a-zA-Z0-9.]+?)\("

请注意,标识符可以与匹配[a-zA-Z_][a-zA-Z0-9_],因此您的模式可以像

re.findall(r'\b(?<!\bdef\s)([a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*)\(', s, re.A)

请注意,re.Are.ASCII只会使\wASCII,字母,数字和匹配ASCII
_

请参阅regex演示

细节

  • \b -单词边界
  • (?<!\bdef\s)-def当前位置左侧不能有+号
  • ([a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*)-捕获组1(其值将是re.findall调用的结果):
    • [a-zA-Z_] -ASCII字母或 _
    • \w* -1个以上的字符
    • (?: -开始与一系列…匹配的非捕获组
    • \. -一个点
    • [a-zA-Z_] -ASCII字母或 _
    • \w* -1个以上的字符
  • )* -…零次或多次
  • \(-一个(字符