除引号中的标识符外,如何匹配标识符?

问题描述

假设我有以下字符串,并且我希望提取所有在引号中都以大写字母 except 开头的标识符:

Match1
Match2(Match3("NoMatch1 a NoMatch2 blabla"),Match4)
meh<Match5>

在这种情况下,Match1Match2Match3Match4Match5应该被捕获,而NoMatch1和{{ 1}}应该被忽略,因为它们在带引号的字符串中。

我可以使用JS正则表达式获得所需的结果。链接(?<=^(\[^\"\]|\"\[^\"\]*\")*)(\b\[A-Z\]\w+\b),但是我所有尝试将其转换为可用的Python正则表达式的尝试都以失败告终。到目前为止我遇到的错误消息:

NoMatch2

我不知道如何解决此问题。使用Python正则表达式完全可以吗?如果是这样,我想念什么?

注意:我还没有实际的Python代码,到目前为止,我一直在https://regex101.com上进行尝试。

解决方法

您可以使用以下模式:

\b[A-Z]\w+(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)

Demo

诀窍是使用正的Lookahead(与Lookbehind不同,长度可以不固定)。因此,我们使用Lookahead来检查双引号的(因为每个开始的引号都会有一个结束的引号)。只要要匹配的单词后面加上偶数双引号(即成对),我们就知道它本身用引号引起来。