我想找到与C ++中不是std
或全局范围的名称空间/类上下文匹配的元素
我正在使用这个
>>> re.findall("(?<!std)::(\w+)","my_namespace::my_function std::vector ::open i=0;::open")
['my_function', 'open', 'open']
因此vector
被过滤掉了,但是我也提取了全局范围的open
(在::
之前我需要一个非空的单词,而不是std
,并且;
不符合条件)
我知道我可以提取名称空间和名称并进行如下处理:
>>> [b for a,b in re.findall("(\w+)::(\w+)","my_namespace::my_function std::vector ::open i=0;::open") if a != 'std']
['my_function']
但是有没有一种纯正则表达式来做到这一点?
答案 0 :(得分:3)
您可以在断言后面添加另一个回溯:
>>> re.findall(r"(?<!std)(?<=\w)::(\w+)", "my_namespace::my_function std::vector ::open")
['my_function']
(?<=\w)
检查::
是否以单词字符开头答案 1 :(得分:2)
您可以使用正则表达式解决方案,例如
re.findall(r'\b(?!std::)\w+::(\w+)', s)
请参见regex demo
详细信息
\b
-单词边界(?!std::)
-当前位置右侧不允许std::
\w+::
-1个以上的字符和::
(\w+)
-捕获组1(re.findall
的实际输出):1个以上的字符字符。