我应该如何声明正则表达式?
mergedData = re.sub(r'\$(.*?)\$', readFile, allData)
我有点想知道为什么这会奏效。我认为我需要使用r''
来传递正则表达式。
mergedData = re.sub("\$(.*?)\$", readFile, allData)
"\$"
在这种情况下会导致什么结果?为什么?我会想到"$"
的。
我认为我需要使用 r'' 来传递正则表达式。
r
before 字符串文字表示原始字符串,这意味着通常的转义序列,例如\n
or\r
不再被视为换行符或回车符,而是简单地\
跟随n
or r
。要指定 a \
,您只需要\
原始字符串文字,而您需要将其加倍为\\
普通字符串文字。这就是为什么在指定正则表达式1时通常使用原始字符串的原因。它减少了阅读代码时的混乱。如果使用普通字符串文字,则必须进行两次转义:一次用于普通字符串文字转义,第二次用于正则表达式中的转义。
"\$"
在这种情况下会产生什么结果?为什么?我本来以为"$"
在 Python 普通字符串文字中,如果\
后面没有转义序列,\
则保留 。因此"\$"
导致. \
_$
这种行为与 C/C++ 或 JavaScript 处理类似情况的方式略有不同:\
被视为下一个字符的转义,并且只保留下一个字符。所以"\$"
在那些语言中会被解释为$
.
脚注
1:Python 中原始字符串的设计存在一个小缺陷:为什么 Python 的原始字符串文字不能以单个反斜杠结尾?
r'...'
转义序列如'\1'
(引用正则表达式中的第一组,但如果未转义,则与 ' 相同)'\x01
。
一般来说,r'...'
反斜杠不会充当转义字符。
尝试
re.split('(.).\1', '1x2x3') # ['1x2x3']
对比
re.split(r'(.).\1', '1x2x3') # ['1', 'x', '3']
因为'\$'
它不是 python 中的转义序列,所以它实际上与'\\$'
.
只问蛇:
>>> r'\$(.*?)\$'=='\$(.*?)\$'
True
>>> r'\vert'=='\vert'
False
>>> r'\123'=='\123'
False
>>> r'\#23'=='\#23'
True
基本上如果\x
会在 C 中创建一个转义字符,则在字符串前缀中使用 r 与\\x
:
>>> r'\123'=='\\123'
True
>>> r'\tab'=='\\tab'
True