Python 为什么Regex原始字符串前缀为;r";没有按预期工作?

Python 为什么Regex原始字符串前缀为;r";没有按预期工作?,python,regex,backslash,Python,Regex,Backslash,我了解到“r”\n“是一个包含'\'和'n'的两个字符的字符串,而“\n”是一个包含换行符的单字符字符串。正则表达式通常会使用这种原始字符串符号用Python代码编写。“而r”\n“相当于“\\n”to表示两个字符串'\'和'n' 我通过打印来测试它,它可以工作 >>>print(r"\n") or print("\\n") '\n' 然而,当我在正则表达式中测试时 >>>import re >>>re.findall("\d+", '12

我了解到“
r”\n“
是一个包含
'\'
'n'
的两个字符的字符串,而
“\n”
是一个包含换行符的单字符字符串。正则表达式通常会使用这种原始字符串符号用Python代码编写。“而
r”\n“
相当于
“\\n”
to表示两个字符串
'\'
'n'

我通过打印来测试它,它可以工作

>>>print(r"\n") or print("\\n")
'\n'
然而,当我在正则表达式中测试时

>>>import re
>>>re.findall("\d+", '12 cats, 10 dogs, 30 rabits, \d is here')
['12', '10', '30']
>>>re.findall(r"\d+", '12 cats, 10 dogs, 30 rabits, \d is here')
['12', '10', '30']  # Still the same as before, seems 'r' doesn't work at all
>>>re.findall("\\d+", '12 cats, 10 dogs, 30 rabits, \d is here')
['12', '10', '30']  # Doesn't work yet
当我尝试这个的时候,它仍然有效

>>>re.findall(r"\\d+", '12 cats, 10 dogs, 30 rabits, \d is here')
['\\d']
>>>re.findall("\\\d+", '12 cats, 10 dogs, 30 rabits, \d is here')
['\\d']
>>>re.findall("\\\\d+", '12 cats, 10 dogs, 30 rabits, \d is here')
['\\d']  # Even four backslashes
为什么??这是否意味着在使用正则表达式时必须再添加一个反斜杠,以确保它是原始字符串

参考:

之所以
“\d+”
有效,是因为
“\d”
在Python字符串中不是正确的转义序列,Python只是将其视为反斜杠加上“d”,而不是产生语法错误

所以
“\d”
“\\d”
r”\d”
都是等价的,表示一个包含一个反斜杠和一个d的字符串。正则表达式引擎会看到这个反斜杠+“d”,并将其解释为“匹配任何数字”

“\\\d”
“\\\\d”
r”\\d”
,另一方面,它们都包含两个反斜杠,后跟一个“d”。这告诉正则表达式引擎匹配反斜杠后跟“d”。

之所以
“\d+”
有效,是因为
“\d”
在Python字符串中不是正确的转义序列,Python只是将其视为反斜杠后跟“d”,而不是生成语法错误

所以
“\d”
“\\d”
r”\d”
都是等价的,表示一个包含一个反斜杠和一个d的字符串。正则表达式引擎会看到这个反斜杠+“d”,并将其解释为“匹配任何数字”


“\\\d”
“\\\\d”
r”\\d”
,另一方面,它们都包含两个反斜杠,后跟一个“d”。这会告诉正则表达式引擎匹配反斜杠后跟“d”。

“\d+”
不是反斜杠具有任何非文字含义的字符串,因此无论是否使用原始语法指定,它都可以工作。然而,对于人类读者来说,原始语法更为清晰——他们不必考虑
“\d”
是否与
“\t”
“\n”
等不同的解析方式。原始字符串禁用Python的反斜杠处理。它们不会禁用正则表达式引擎的反斜杠处理;这将完全违背原始字符串的用途。
“\d+”
不是反斜杠具有任何非文字含义的字符串,因此无论是否使用原始语法指定,它都有效。然而,对于人类读者来说,原始语法更为清晰——他们不必考虑
“\d”
是否与
“\t”
“\n”
等不同的解析方式。原始字符串禁用Python的反斜杠处理。它们不会禁用正则表达式引擎的反斜杠处理;这将完全破坏原始字符串的用途。