首页 > 解决方案 > Negative Lookahead & Negative Lookbehind 排除被引号包围的字母数字字符

问题描述

我正在尝试创建一个区分变量名和字符串的正则表达式。字符串用引号括起来,变量名由字母数字字符和下划线组成。我正在尝试匹配整行中的子字符串,因此由于^锚定到行首并$锚定到行尾,因此我避免了这两个。

我排除某些变量名称的问题涉及我的否定前瞻。它只适用于一个字符,我希望这个规则也适用于子字符串的开头。

例如:

(?<!")([A-Za-z_]+[A-Za-z0-9_]*)(?!")

如果给这个正则表达式字符串Hello there,它将返回 2 个匹配项,Hello并且there. 这是意料之中的。但是,如果我在子字符串的末尾添加引号,则直到带有以下引号的字符之前的每个字符仍将作为匹配项返回。例如,Hello there"将匹配Hellother与这个正则表达式。考虑到我在中组比赛中的第一个系列赛,我想这也是有道理的。

我的分组有什么问题?

标签: regex

解决方案


您可以使用

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']

推荐阅读