python - 除非在引号中找到,否则如何匹配标识符?
问题描述
假设我有以下字符串,并且我想提取所有以大写字母开头的标识符,除非在引号中找到:
Match1
Match2(Match3("NoMatch1 a NoMatch2 blabla"), Match4)
meh<Match5>
在这种情况下,Match1
, Match2
, Match3
, Match4
, 和Match5
应该被捕获,而NoMatch1
和NoMatch2
应该被忽略,因为它们在带引号的字符串中。
我可以使用 JS 正则表达式得到想要的结果。链接:(?<=^(\[^\"\]|\"\[^\"\]*\")*)(\b\[A-Z\]\w+\b)
,但是我所有将其转换为有效的 Python 正则表达式的尝试都失败了。到目前为止我遇到的错误消息:
( A lookbehind assertion has to be fixed width
* A quantifier inside a lookbehind makes it non-fixed width
) A lookbehind assertion has to be fixed width
* A quantifier inside a lookbehind makes it non-fixed width
我不知道如何解决这个问题。这完全有可能使用 Python 正则表达式吗?如果是这样,我错过了什么?
注意:我还没有实际的 Python 代码,到目前为止,我一直在https://regex101.com上进行尝试。
解决方案
您可以使用以下模式:
\b[A-Z]\w+(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)
演示。
诀窍是使用正向 Lookahead(它可以具有非固定长度,与 Lookbehind 不同)。因此,我们使用 Lookahead 来检查成对的双引号(因为每个开始引号都有一个结束引号)。只要要匹配的单词后面跟着偶数个双引号(即双引号),我们就知道它本身没有用引号括起来。
推荐阅读
- sql - 如何在 bigquery 数据表中添加计算列?
- python-3.x - 基于主列表自动排序文件
- java - 类数组的编译时初始化,其中包含一个整数数组
- c++ - 在 C 或 C++ 中,如何防止头文件中以前的#define 影响以后包含的另一个头文件?
- javascript - react-native:后退按钮处理程序
- javascript - discord.js 权限模块不断打印未定义
- go - 如何使用按位运算符将任何负值转换为零?
- mule - Mulesoft IBM MQ 连接器在 Mule 3.9 中的发布-消费操作等效?
- php - 当我在 codeigniter / php 中将图像作为发布数据传递时,为什么会出现 Forbidden 错误?
- r - 为什么 dplyr filter() 不能正确过滤掉两列中的空白?