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

时间:2014-10-13 01:57:22

标签: 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("[^\\][\\\\]*\$(\w[^-]+)|"
                  "[^\\][\\\\]*\$\{(\w[^-]+)\}",replace,line)

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

编写一个找到$的正则表达式,除非使用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)

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