查找没有其他字符串开头的字符串
问题内容:
我只想在['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.A
或re.ASCII
只会使\w
ASCII,字母,数字和匹配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个以上的字符
)*
-…零次或多次\(
-一个(
字符