我试图创建一个正则表达式,找出$ 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时,由于某种原因它仍然匹配。这是为什么?
答案 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字符串文字和正则表达式模式中的反斜杠。