字符串字面量——原始字符串抑制转义
已经看到:转义序列对在字符串中嵌入特殊字符码是很方便的。然而,有时引入转移的反斜杠的特殊处理会导致麻烦。比如,令人意外的经常看到班上的 Python 新手尝试使用如下所示的文件名参数打开文件:
myfile = open('C:\new\text.dat', 'w')
想着他们将打开在目录 C:\new
的名为 text.dat
的文件。这里的问题是 \n
被用来代表一个换行符,而 \t
被一个 tab 所代替。事实上,这个调用尝试去打开名为 C:(newline)ew(tab)ext.dat
的文件,结果通常不尽如人意。
这就是原始字符串可以发挥作用的那类事情。如果在字符串的左括号前出现了字面 r
(大写或小写均可),它就会关闭转义机制。结果是 Python 从字面上保留了反斜杠,就像键入的那样。因此,要修复文件名问题,只要记住在 Windows 上添加字母 r:
myfile = open(r'C:\new\text.dat', 'w')
另外,因为两个反斜杠其实是对一个反斜杠的转义序列,因此可以简单地使用双反斜杠来保留反斜杠:
myfile = open('C:\\new\\text.dat', 'w')
事实上,Python 自己有时在打印带嵌套反斜杠时也使用这个双写方案:
>>> path = r'C:\new\text.dat'
>>> path # 显示为Python代码
'C:\\new\\text.dat'
>>> print(path) # 用户友好的格式
C:\new\text.dat
>>> len(path) # 字符串长度
15
和数字表示法一样,在交互式提示符处的默认格式打印结果时,就好像它们是代码一样,因此转义了输出中的反斜杠。print
语句则提供了更用户友好的格式,显示了在每个反斜杠出现的位置都只有一个反斜杠。要验证这一点,可以检查内置 len
函数的结果,它返回了字符串中的字符数量,与显示格式无关。如果数一下 print(path)
输出中的字符,会发现每一个反斜杠真的只是一个字符,合计 15 个字符。
除了 Windows 上的目录路径,原始字符串还通常用于正则表达式(文本模式匹配,由在第 4,37 章中引入的 re
模块所支持)。还注意到 Python 脚本在 Windows 和 Unix 上的目录路径中还通常使用斜杠,因为 Python 尝试可移植性地解释路径(也就是说,当打开文件时,'C:/new/text.dat' 也是可以的)。然而,如果编码路径使用原生的 Windows 反斜杠,原始字符串会很有用。
注意:
尽管有这个作用,原始字符串也不能以单个反斜杠结尾,因为反斜杠转义了后面的引号字符 —— 仍必须转义周围的引号字符把它嵌入字符串。 也就是说,r"...\"
不是有效的字符串字面量 —— 原始字符串不能以奇数个反斜杠结尾。如果需要以单个反斜杠来结束原始字符串,可以使用两个反斜杠,然后切掉第二个( r'1\nb\tc\\'[:-1]
),手动加上一个反斜杠(r'1\nb\tc' + '\\'
)或不使用原始字符串语法,只是在普通字符串中使用双反斜杠('1\\nb\\tc\\'
)。所有这三种形式都创建了包含三个反斜杠的同样的八字符字符串。