re模块 - r符号是什么?
我想弄明白这段代码:
Var1 = re.compile(r"nothing is (\d+)").search
我想看看在(符号后面加上r这个标记,对\d有什么影响。我知道\d是用来找小数数字的(\表示d有特别的意思),那么如果没有r这个标记,我是不是就得用\?如果是这样,为什么呢?我知道在bash命令行中只需要一个\就可以了。
我在这里读过:http://docs.python.org/library/re.html#raw-string-notation
但是我还是不明白它是怎么影响上面的代码片段的。谢谢。
2 个回答
这和 re
没什么关系。
Python中的字符串字面量 可以以 r
开头;这些叫做“原始字符串”,在这种情况下,反斜杠的转义符(比如用来表示特殊字符的符号)大部分情况下不会被解释。
这是一种叫做原始字符串字面量的东西。它让反斜杠(\)被当作普通字符来处理(几乎是这样,下面会解释)。这在写正则表达式时特别有用,因为正则表达式里常常会有反斜杠。如果你用普通的字符串字面量,就得把反斜杠再加上转义符,这样会让正则表达式变得更难读。
如果没有r
,你的代码看起来会是这样的:
f = re.compile("nothing is (\\d+)").search
注意,在这种情况下不转义反斜杠也是可以的,因为'\d'
并不是一个有效的转义序列:
f = re.compile("nothing is (\d+)").search
不过,依赖这种行为可能会导致错误,除非你(以及所有需要维护你代码的人)能记住允许的转义序列列表。
原始字符串字面量的规则是:
当有
'r'
或'R'
前缀时,反斜杠后面的字符会直接包含在字符串中,不会改变,所有的反斜杠都会保留在字符串里。例如,字符串字面量r"\n"
由两个字符组成:一个反斜杠和一个小写的'n'
。字符串引号可以用反斜杠转义,但反斜杠仍然会保留在字符串中;例如,r"\""
是一个有效的字符串字面量,由两个字符组成:一个反斜杠和一个双引号;而r"\"
不是一个有效的字符串字面量(即使是原始字符串也不能以奇数个反斜杠结尾)。特别地,原始字符串不能以单个反斜杠结尾(因为反斜杠会转义后面的引号字符)。另外,注意单个反斜杠后面跟着换行符会被解释为这两个字符是字符串的一部分,而不是作为换行的延续。