查找前面没有其他字符串的字符串

Cee*_*man 2 python regex python-3.x

我只想到达['bar']这里:

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

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

Wik*_*żew 5

当前正则表达式匹配ooinfoo因为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)
Run Code Online (Sandbox Code Playgroud)

请注意,re.Aorre.ASCII只会\w匹配 ASCII 字母、数字和_

请参阅正则表达式演示

细节

  • \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+ 个单词字符
  • )*- ...零次或多次
  • \(- 一个(字符。