如何创建添加的负向后查找表达式-不得为空字

时间:2018-10-18 14:34:56

标签: python regex negative-lookbehind

我想找到与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']

但是有没有一种纯正则表达式来做到这一点?

2 个答案:

答案 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个以上的字符字符。