作者: 一去、二三里
个人微信号: iwaleon
微信公众号: 高效程序员
在字符串中,有时需要包含一些特殊的符号,但是有些符号不能直接输出,就需要使用转义序列。
关于转义,维基百科这样定义:
转义是当由于技术等原因、无法直接在代码中写出所要的字符时采用的,以多个字符的有序组合来表示原本需要的字符的手段,而转义序列(escape sequence)指在转义时使用的有序字符组合。
转义序列
作为一名伟大的程序员,在向别人介绍自己的职业时,往往会很自豪的说:Hi, "I'm a Pythonista"
。如果要在 Python 中表示这句话,不能直接使用单引号或双引号。
>>> print('Hi, "I'm a Pythonista"')
...
SyntaxError: invalid syntax
>>>
>>> print("Hi, "I'm a Pythonista"")
...
SyntaxError: invalid syntax
要解决这个问题,有两种方式:
- 使用三重引号
- 使用转义序列
转义序列以反斜杠(\
)开头,并以不同的方式解释。如果使用单引号来表示字符串,那么字符串内的所有单引号都必须转义,双引号也不例外。
>>> print('''Hi, "I'm a Pythonista"''') # 使用三重引号
Hi, "I'm a Pythonista"
>>>
>>> print('Hi, "I\'m a Pythonista"') # 转义单引号
Hi, "I'm a Pythonista"
>>>
>>> print("Hi, \"I'm a Pythonista\"") # 转义双引号
Hi, "I'm a Pythonista"
以下是 Python 支持的所有转义序列的列表:
转义序列 | 说明 |
---|---|
\(行尾) | 续行符 |
\\ | 反斜杠 |
\' | 单引号 |
\" | 双引号 |
\a | 响铃 |
\b | 退格(Backspace) |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ooo | 值为八进制 ooo 的字符 |
\xhh | 值为十六进制 hh 的字符 |
测试其中的转义序列,感受一下实际的意思:
>>> print('C:\\Windows\\System32')
C:\Windows\System32
>>>
>>> print('I like \nPython')
I like
Python
>>>
>>> print('This is \x48\x45\x58')
This is HEX
原始字符串
原始字符串(Raw String),简单理解就是:字符串中的每个字符都表示原始含义。
有时,可能希望忽略字符串中的转义序列:
>>> print('This is \x48\x45\x58')
This is HEX
遗憾的是,这里的反斜杠并不是原始符号的含义,而是和后面的字符一起表示十六进制(被转义了)。
如何避免呢?很 easy,为字符串加上前缀 r 或者 R(大小写均可):
>>> print(r'This is \x48\x45\x58')
This is \x48\x45\x58
R 是 Raw 的缩写,以其开头的字符串被称作原始字符串,并将反斜杠视为原义字符。因此,其中的任何转义序列都不会被特别处理,将会被忽略。