如何创建一个负面的后视表达式 - 添加 - 不能是一个空词

how to create a negative lookbehind expression that - added - must not be an empty word

我想在 C++ 中找到匹配 namespaces/class 上下文的元素,这些元素不是 std 或全局范围

我正在使用这个:

>>> re.findall("(?<!std)::(\w+)","my_namespace::my_function std::vector ::open i=0;::open")
['my_function', 'open', 'open']

所以 vector 如我所料被过滤掉了,但是全局范围的 open 也被提取了(我需要在 :: 之前有一个非空词,它不是 std; 不符合条件)

我知道我可以像这样提取命名空间和名称以及 post 过程:

>>> [b for a,b in re.findall("(\w+)::(\w+)","my_namespace::my_function std::vector ::open i=0;::open") if a != 'std']
['my_function']

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

您可以添加另一个回顾断言:

>>> re.findall(r"(?<!std)(?<=\w)::(\w+)", "my_namespace::my_function std::vector ::open")
['my_function']
  • (?<=\w) 检查 :: 前面是否有单词字符

您可以使用像

这样的正则表达式解决方案
re.findall(r'\b(?!std::)\w+::(\w+)', s)

regex demo

详情

  • \b - 单词边界
  • (?!std::) - 不允许std::紧靠当前位置的右侧
  • \w+:: - 1+ 个单词字符和 ::
  • (\w+) - 捕获组 1(re.findall 的实际输出):1+ 个字符。