0. 参考资料
Why can’t Python’s raw string literals end with a single backslash?
1. 现象
Python
的原始字符串有很多应用场景,比如用来表示 Windows
的路径和应用于正则表达式中。
但是在使用的时候却发现,原始字符串无法以单个反斜杠结尾,或者说,原始字符串无法以奇数个反斜杠结尾。
尝试如下:
>>> r'\'
File "<input>", line 1
r'\'
^
SyntaxError: EOL while scanning string literal
>>> r'\\\'
File "<input>", line 1
r'\\\'
^
SyntaxError: EOL while scanning string literal
2. 解释
大多数人的误解在于认为原始字符串里的反斜杠与其他字符没有什么不同。
这是错的!
当
r
或者R
前缀存在的时候,在反斜杠后面的字符保持不变,并且反斜杠本身会保留在字符串中。
所以任何在反斜杠后面的字符都是原始字符串的一部分。
这样一来:
r'abc\d'
由a, b, c, \, d
组成r'abc\'d'
由a, b, c, \, ', d
组成r'abc\''
由a, b, c, \, '
组成
那么,重点来了:
r'abc\'
由a, b, c, \, '
组成,但是现在没有结束字符串的引号了!
所以原始字符串无法以单个的(奇数个的)反斜杠结尾。
3. 解决
方式 1
不在原始字符串后面写单个反斜杠,而是采用拼接的方式用普通字符串加上反斜杠。
>>> test = r'测试''\\'
>>> print(test)
测试\
方式 2
在原始字符串后面写两个反斜杠,然后采用切片操作切除最后一个反斜杠。
>>> test = r'测试\\'[:-1]
>>> print(test)
测试\
方式 3
不使用原始字符串,直接使用普通字符串。
>>> test = '测试\\'
>>> print(test)
测试\
完成于 201810290705