我只想在这里得到['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()")
答案 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个以上的字符字符)*
-...零次或多次\(
-一个(
字符。