问题描述
假设我有以下字符串,并且我希望提取所有在引号中都以大写字母 except 开头的标识符:
Match1
Match2(Match3("NoMatch1 a NoMatch2 blabla"),Match4)
meh<Match5>
在这种情况下,Match1
,Match2
,Match3
,Match4
和Match5
应该被捕获,而NoMatch1
和{{ 1}}应该被忽略,因为它们在带引号的字符串中。
我可以使用JS正则表达式获得所需的结果。链接:(?<=^(\[^\"\]|\"\[^\"\]*\")*)(\b\[A-Z\]\w+\b)
,但是我所有尝试将其转换为可用的Python正则表达式的尝试都以失败告终。到目前为止我遇到的错误消息:
NoMatch2
我不知道如何解决此问题。使用Python正则表达式完全可以吗?如果是这样,我想念什么?
注意:我还没有实际的Python代码,到目前为止,我一直在https://regex101.com上进行尝试。
解决方法
您可以使用以下模式:
\b[A-Z]\w+(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)
Demo 。
诀窍是使用正的Lookahead(与Lookbehind不同,长度可以不固定)。因此,我们使用Lookahead来检查双引号的对(因为每个开始的引号都会有一个结束的引号)。只要要匹配的单词后面加上偶数双引号(即成对),我们就知道它本身不用引号引起来。