regex - Negative Lookahead & Negative Lookbehind 排除被引号包围的字母数字字符
问题描述
我正在尝试创建一个区分变量名和字符串的正则表达式。字符串用引号括起来,变量名由字母数字字符和下划线组成。我正在尝试匹配整行中的子字符串,因此由于^
锚定到行首并$
锚定到行尾,因此我避免了这两个。
我排除某些变量名称的问题涉及我的否定前瞻。它只适用于一个字符,我希望这个规则也适用于子字符串的开头。
例如:
(?<!")([A-Za-z_]+[A-Za-z0-9_]*)(?!")
如果给这个正则表达式字符串Hello there
,它将返回 2 个匹配项,Hello
并且there
. 这是意料之中的。但是,如果我在子字符串的末尾添加引号,则直到带有以下引号的字符之前的每个字符仍将作为匹配项返回。例如,Hello there"
将匹配Hello
和ther
与这个正则表达式。考虑到我在中组比赛中的第一个系列赛,我想这也是有道理的。
我的分组有什么问题?
解决方案
您可以使用
r"""'[^'\\]*(?:\\.[^'\\]*)*'|"[^"\\]*(?:\\.[^"\\]*)*"|\b([A-Za-z_]+[A-Za-z0-9_]*)\b"""
请参阅正则表达式演示。
详情:
'[^'\\]*(?:\\.[^'\\]*)*'
- 单引号字符串文字|
- 或者"[^"\\]*(?:\\.[^"\\]*)*"
- 双引号字符串文字|
- 或者\b([A-Za-z_]+[A-Za-z0-9_]*)\b
- 一个或多个字母或下划线,然后是零个或多个字母数字字符。
请参阅Python 演示:
import re
rx = r"""'[^'\\]*(?:\\.[^'\\]*)*'|"[^"\\]*(?:\\.[^"\\]*)*"|\b([A-Za-z_]+[A-Za-z0-9_]*)\b"""
text = r"""
Hello Colm "This is a test\\\\"
"This is also an NL test"
'And this has an escaped quote don\'t in it ' Blue Boy
"This has a single quote ' but doesn\' end the quote as it started with double quotes"
"line spanning with escaped quote at the end of a line\"
"
"Foo Bar" "Another Value" something else
"""
print(list(filter(None, re.findall(rx, text))))
# => ['Hello', 'Colm', 'Blue', 'Boy', 'something', 'else']
推荐阅读
- react-native - 如何修复 item.split 不是函数
- php - Laravel 使用 Accessors & Mutators 上传多个文件
- java - 项目构建成功,应用程序正在运行,但 R 类保持红色
- amazon-s3 - 使用 API 网关、Lambda 函数将图像上传到 S3 存储桶
- python - 我可以在我的设置函数中调用基类方法吗
- angular - “EventTypes”类型的参数不可分配给字符串类型的参数
- laravel - 当我将数组传递给查看时,出现错误“尝试获取非对象的属性”
- python - tensorflow /model/research/lstm_object_detection 中没有名为“lstm_object_detection”的模块
- javascript - 击键后React JS输入类型文本失去焦点
- vim - 启动 vim 时禁用替换模式