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)