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

时间:2018-07-06 11:16:44

标签: python regex python-3.x

我只想在这里得到['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()")

1 个答案:

答案 0 :(得分:4)

当前正则表达式与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.A or re.ASCII将使\w与仅ASCII的字母,数字和_匹配。

请参见regex demo

详细信息

  • \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个以上的字符字符
  • )*-...零次或多次
  • \(-一个(字符。