我应该如何声明一个正则表达式?
mergedData = re.sub(r'$(.*?)$', readFile, allData)
我有点想知道为什么会这样。我认为我需要使用 r''
来传递正则表达式。
mergedData = re.sub("$(.*?)$", readFile, allData)
在这种情况下,"$"
会导致什么结果?为什么?我会认为"$"
.
我认为我需要使用 r'' 来传递正则表达式。
字符串文本之前的r
表示原始字符串,这意味着通常的转义序列(如 n
或 r
(不再被视为换行符或回车符,而只是后跟
n
或 r
。要指定,您只需要在原始字符串文本中
,而您需要将其加倍
\
普通字符串文本中。这就是为什么通常使用原始字符串来指定正则表达式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 中创建 esaced 字符,则在字符串前缀中使用 r 与 \x
相同:
>>> r'123'=='\123'
True
>>> r'tab'=='\tab'
True