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

时间:2018-02-04 00:42:48

标签: python regex backslash

我了解到" r"\n"是包含'\''n'的双字符字符串,而"\n"是包含换行符的单字符字符串。正则表达式通常使用这种原始字符串表示法用Python代码编写。" r"\n"相当于"\\n",表示双字符字符串'\''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

为什么呢?这是否意味着我必须在使用正则表达式时添加一个反斜杠以确保它是原始字符串?

参考:https://docs.python.org/3/howto/regex.html

1 个答案:

答案 0 :(得分:2)

"\d+"工作的原因是"\d"不是Python字符串中的正确转义序列,而Python只是将其视为反斜杠,然后是" d"而不是产生语法错误。

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

另一方面,

"\\\d""\\\\d"r"\\d"都包含两个反斜杠,后跟一个" d"。这告诉正则表达式引擎匹配反斜杠后跟" d"。