我应该如何声明正则表达式?
mergedData = re.sub(r'\$(.*?)\$', readFile, allData)
我有点想知道为什么会这样。我认为我需要使用r''
来传递正则表达式。
mergedData = re.sub("\$(.*?)\$", readFile, allData)
在这种情况下"\$"
会导致什么?为什么?我原以为"$"
。
答案 0 :(得分:6)
字符串文字之前的我认为我需要使用r''来传递正则表达式。
r
表示原始字符串,这意味着通常的转义序列(例如\n
或\r
)不再被视为换行符或回车符,而只是{ {1}}后跟\
或n
。要指定r
,您只需要原始字符串文字中的\
,而您需要在普通字符串文字中将其加倍\
。这就是为什么通常情况下原始字符串用于指定正则表达式 1 。它减少了阅读代码时的困惑。如果使用普通字符串文字,则必须进行两次转义:一次用于正常的字符串文字转义,第二次用于在正则表达式中转义。
\\
导致这种情况的原因是什么?为什么?我原以为"\$"
在Python普通字符串文字中,如果"$"
后面没有转义序列,则会保留\
。因此,\
会导致"\$"
后跟\
。
此行为与C / C ++或JavaScript处理类似情况的方式略有不同:$
被视为下一个字符的转义,只剩下下一个字符。因此,这些语言中的\
将被解释为"\$"
。
<强>脚注强>
1 :Python中的原始字符串设计存在一个小缺陷:Why can't Python's raw string literals end with a single backslash?
答案 1 :(得分:3)
r'...'
escapes sequences,如'\1'
(对正则表达式中的第一个组的引用,但如果未转义,则与'\x01
相同)。
一般来说,在r'...'
中,反斜杠不会表现为转义字符。
尝试
re.split('(.).\1', '1x2x3') # ['1x2x3']
VS
re.split(r'(.).\1', '1x2x3') # ['1', 'x', '3']
由于'\$'
不是python中的转义序列,因此它与'\\$'
字面上相同。
答案 2 :(得分:1)
问问蛇:
>>> r'\$(.*?)\$'=='\$(.*?)\$'
True
>>> r'\vert'=='\vert'
False
>>> r'\123'=='\123'
False
>>> r'\#23'=='\#23'
True
基本上如果\x
would create an esacped character in C,则在字符串前缀中使用r与\\x
相同:
>>> r'\123'=='\\123'
True
>>> r'\tab'=='\\tab'
True