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的反斜杠处理。它们不会禁用正则表达式引擎的反斜杠处理;这将完全破坏原始字符串的用途。