字符串字面量——原始字符串抑制转义

未匹配的标注

已经看到:转义序列对在字符串中嵌入特殊字符码是很方便的。然而,有时引入转移的反斜杠的特殊处理会导致麻烦。比如,令人意外的经常看到班上的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\\')。所有这三种形式都创建了包含三个反斜杠的同样的八字符字符串。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~