我对正则表达式中的反斜杠感到困惑。在正则表达式中,a\具有特殊含义,例如\d表示十进制数字。如果在反斜杠前面添加反斜杠,则该特殊含义会丢失。在正则表达式中,可以阅读:
\
\d
也许最重要的元字符是反斜杠\。与Python字符串文字一样,反斜杠后可以跟各种字符,以表示各种特殊序列。它也用于转义所有元字符,因此您仍可以按模式匹配它们。例如,如果您需要匹配[或\,则可以在它们前面加上反斜杠以删除其特殊含义:\[或\\。
[
\[
\\
因此print(re.search('\d', '\d'))给出,None因为\d匹配任何十进制数字,但中没有\d。
print(re.search('\d', '\d'))
None
我现在希望print(re.search('\\d', '\d'))能匹配,\d但答案仍然是None。
print(re.search('\\d', '\d'))
仅print(re.search('\\\d', '\d'))作为输出给出<_sre.SRE_Match object; span=(0, 2), match='\\d'>。
print(re.search('\\\d', '\d'))
<_sre.SRE_Match object; span=(0, 2), match='\\d'>
有人有解释吗?
造成混淆的原因是反斜杠字符\在两个不同的级别上用作转义符。首先,Python解释器本身会\在re模块看到您的字符串之前执行的替换。例如,\n将其转换为换行符,\t将其转换为制表符,等等。要获得实际的\字符,您也可以对其进行转义,从而\\给出一个\字符。如果后面的字符\不是公认的转义字符,则该字符\会像其他任何字符一样被处理并通过,但是我不建议以此为依据。相反,请始终\通过将字符加倍来逃脱字符,即\\。
re
\n
\t
如果要查看Python如何扩展字符串转义符,只需打印出字符串即可。例如:
s = 'a\\b\tc' print(s)
如果s是集合数据类型(例如列表或元组)的一部分,并且如果您打印该集合,Python会将字符串用单引号引起来,并将\转义符(以规范形式)包括在内,因此请注意字符串的用法正在打印。如果仅在解释器中输入带引号的字符串,它还将显示用引号引起来的\转义符。
s
一旦知道了字符串的编码方式,便可以考虑re模块将如何处理它。例如,如果要转义\到传递给re模块的字符串中,则需要传递\\给re,这意味着您需要\\\\在带引号的Python字符串中使用。Python字符串将以结尾,\\并且re模块会将其视为单个文字\字符。
\\\\
\在Python字符串中包含字符的另一种方法是使用原始字符串,例如r'a\b'等效于"a\\b"。
r'a\b'
"a\\b"