Regex 消极前瞻&;反向查找以排除由引号包围的字母数字字符

Regex 消极前瞻&;反向查找以排除由引号包围的字母数字字符,regex,Regex,我正在尝试创建一个正则表达式来区分变量名和字符串。字符串将被引号包围,变量名将由字母数字字符和下划线组成。我试图在整行中匹配子字符串,因此由于^锚定到行的开头,而$锚定到行的结尾,因此我避免了这两种情况 我排除某些变量名的问题与我的消极前瞻有关。它只适用于一个字符,我希望这个规则也适用于子字符串的开头 例如: (?<!")([A-Za-z_]+[A-Za-z0-9_]*)(?!") (? 如果给这个正则表达式一个字符串Hello there,它将返回两个匹配项,Hel

我正在尝试创建一个正则表达式来区分变量名和字符串。字符串将被引号包围,变量名将由字母数字字符和下划线组成。我试图在整行中匹配子字符串,因此由于
^
锚定到行的开头,而
$
锚定到行的结尾,因此我避免了这两种情况

我排除某些变量名的问题与我的消极前瞻有关。它只适用于一个字符,我希望这个规则也适用于子字符串的开头

例如:

(?<!")([A-Za-z_]+[A-Za-z0-9_]*)(?!")
(?
如果给这个正则表达式一个字符串
Hello there
,它将返回两个匹配项,
Hello
there
。这是预期的。但是,如果我在子字符串的末尾添加引号,则在包含以下引号的字符之前,每个字符都将作为匹配项返回。例如,将匹配<代码> hello <代码>和<代码> THE/<代码>这个正则表达式。我猜,这也是有意义的,因为我在中间组匹配中给出了第一个系列。

我的分组有什么问题吗?

您可以使用

r"""'[^'\\]*(?:\\.[^'\\]*)*'|"[^"\\]*(?:\\.[^"\\]*)*"|\b([A-Za-z_]+[A-Za-z0-9_]*)\b"""

详情:

  • “[^'\]*(?:\\.[^'\]*)*”
    -一个带引号的字符串文本
  • |
    -或
  • “[^”\]*(?:\\.[^”\]*)*”
    -双引号字符串文本
  • |
    -或
  • \b([A-Za-z]+[A-Za-z0-9\]*)\b
    -一个或多个字母或下划线,然后是零个或多个字母数字字符
见:

重新导入
rx=r”“”[^'\]*(?:\.\.^'\]*)*“[^”\]*(?:\\.\.^\]*)*“\\\b([A-Za-z\]+[A-Za-z0-9\]*)\b”“”
text=r“”
你好,科姆“这是一个测试”
“这也是NL测试”
“这有一句转义的话,别在里面”蓝孩子
“这有一个单引号'但不\'结束引号,因为它以双引号开始”
“在行尾使用转义引号跨越行\”
"
“Foo Bar”“另一个值”“其他值”
"""
打印(列表(过滤器(无,关于findall(接收,文本)))
#=>[“你好”、“科尔姆”、“蓝色”、“男孩”、“某物”、“其他”]

所以你想要
(?)这当然更接近我想要的。提供字符串
“你好”
将排除
“你好”
你”
但它将匹配那里的
如何
,以及
。我想的是某种递归,排除引号之间或旁边的所有内容。@WiktorStribiż当你说“inverse”时,基本上就是这个解决方案的反面,首先想到的是拆分。什么是编程语言?这是否意味着您要在此处提取所有绿色单词-?
re.findall(r'''[^'\]*(?:\.[^'\]*)*“[^'\]*(?:\.\.\.^'\]*”(\w+),text)