Python 在正则表达式中允许转义序列

Python 在正则表达式中允许转义序列,python,regex,Python,Regex,我正在尝试创建一个正则表达式来查找$VAR或${VAR}的出现。如果给定了\$VAR或\${VAR}之类的内容,则它将不匹配。如果给它类似\\$VAR或\\${VAR}或2的任意倍数,它应该匹配 i.e. $BLOB matches \$BLOB doesn't match \\$BLOB matches \\\$BLOB doesn't match \\\\$BLOB matches ... etc 我目前正在使用以下正则表达式: line = re.sub("[^\\][\\\\]

我正在尝试创建一个正则表达式来查找$VAR或${VAR}的出现。如果给定了\$VAR或\${VAR}之类的内容,则它将不匹配。如果给它类似\\$VAR或\\${VAR}或2的任意倍数,它应该匹配

i.e.
$BLOB matches
\$BLOB doesn't match
\\$BLOB matches
\\\$BLOB doesn't match
\\\\$BLOB matches
... etc
我目前正在使用以下正则表达式:

    line = re.sub("[^\\][\\\\]*\$(\w[^-]+)|"
                  "[^\\][\\\\]*\$\{(\w[^-]+)\}",replace,line)

然而,这并不能正常工作。当我给它\$BLOB时,由于某种原因它仍然匹配。这是为什么?

第二组双斜杠被编写为冗余字符类
[\\\\]*
,匹配一个或多个反斜杠,但应该是一个重复组
((?:\\\\\)*)
匹配一组或多组两个反斜杠:

 re.sub(r'(?<!\\)((?:\\\\)*)\$(\w[^-]+|\{(\w[^-]+)\})',r'\1' + replace, line)

re.sub(r'(?编写一个正则表达式,该正则表达式将查找
$
,除非它使用
E
进行转义,除非它反过来也被转义EE:

import re

values = dict(BLOB='some value')
def repl(m):
    return m.group('before') + values[m.group('name').strip('{}')]

regex = r"(?<!E)(?P<before>(?:EE)*)\$(?P<name>N|\{N\})"
regex = regex.replace('E', re.escape('\\'))
regex = regex.replace('N', r'\w+') # name
line = re.sub(regex, repl, line)
重新导入
values=dict(BLOB='some value')
def repl(m):
返回m.group('before')+值[m.group('name').strip('{}')]
regex=r“(?(?:EE)*)\$(?PN{N\})”
regex=regex.replace('E',re.escape('\\'))
regex=regex.replace('N',r'\w+')#名称
line=re.sub(regex,repl,line)

使用
E
而不是
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
公开嵌入的语言,而不考虑Python字符串文本和正则表达式模式中的反斜杠。

r'\1'做了什么?@Apollo the
r'\1'
是第一组。在这种情况下,它会将许多反斜杠放在替换之前也就是说,如果
line
\\$BLOB
replace
x
,那么
line
将变成
\\x
,而不仅仅是
x