2.4.1. 字符串和字节串字面值
字符串字面值由以下词法定义进行描述:
- stringliteral ::= [
stringprefix
](shortstring
|longstring
)- stringprefix ::= "r" | "u" | "R" | "U" | "f" | "F"
- | "fr" | "Fr" | "fR" | "FR" | "rf" | "rF" | "Rf" | "RF"
- shortstring ::= "'"
shortstringitem
* "'" | '"'shortstringitem
* '"'- longstring ::= "'''"
longstringitem
* "'''" | '"""'longstringitem
* '"""'- shortstringitem ::=
shortstringchar
|stringescapeseq
- longstringitem ::=
longstringchar
|stringescapeseq
- shortstringchar ::= <any source character except "\" or newline or the quote>
- longstringchar ::= <any source character except "\">
- stringescapeseq ::= "\" <any source character>
- bytesliteral ::=
bytesprefix
(shortbytes
|longbytes
)- bytesprefix ::= "b" | "B" | "br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB"
- shortbytes ::= "'"
shortbytesitem
* "'" | '"'shortbytesitem
* '"'- longbytes ::= "'''"
longbytesitem
* "'''" | '"""'longbytesitem
* '"""'- shortbytesitem ::=
shortbyteschar
|bytesescapeseq
- longbytesitem ::=
longbyteschar
|bytesescapeseq
- shortbyteschar ::= <any ASCII character except "\" or newline or the quote>
- longbyteschar ::= <any ASCII character except "\">
- bytesescapeseq ::= "\" <any ASCII character>
这些条目中未提及的一个语法限制是 stringprefix
或 bytesprefix
与字面值的剩余部分之间不允许有空白。源字符集是由编码声明定义的;如果源文件中没有编码声明则默认为 UTF-8;参见 编码声明。
自然语言描述: 两种字面值都可以用成对单引号 ('
) 或双引号 ("
) 来标示首尾。它们也可以用成对的连续三个单引号或双引号来标示首尾 (这通常被称为 三引号字符串)。反斜杠 (\
) 字符被用来对特殊含义的字符进行转义,例如换行,反斜杠本身或是引号等字符。
字节串字面值总是带有前缀 'b'
或 'B'
;它们生成 bytes
类型而非 str
类型的实例。它们只能包含 ASCII 字符;字节对应数值在128及以上必须以转义形式来表示。
字符串和字节串字面值都可以带有前缀 'r'
或 'R'
;这种字符串被称为 原始字符串 其中的反斜杠会被当作其本身的字面字符来处理。因此在原始字符串字面值中,'\U'
和 '\u'
转义形式不会被特殊对待。由于 Python 2.x 的原始统一码字面值的特性与 Python 3.x 不一致,'ur'
语法已不再被支持。
3.3 新版功能: 新加入了表示原始字节串的 'rb'
前缀,与 'br'
的意义相同。
3.3 新版功能: 对旧式统一码字面值 (u'value'
) 的支持被重新引入以简化 Python 2.x 和 3.x 代码库的同步维护。详情见 PEP 414。
包含 'f'
或 'F'
前缀的字符串字面值称为 格式化字符串字面值;参见 格式化字符串字面值。'f'
可与 'r'
连用,但不能与 'b'
或 'u'
连用,因此存在原始格式化字符串,但不存在格式化字节串字面值。
在三引号字面值中,允许存在未经转义的换行和引号 (并原样保留),除非是未经转义的连续三引号,这标示着字面值的结束。 (“引号” 是用来标示字面值的字符,即 '
或 "
。)
除非带有 'r'
或 'R'
前缀,字符串和字节串字面值中的转义序列会基于类似标准 C 中的转义规则来解读。可用的转义序列如下:
转义序列 | 意义 | 注释 |
---|---|---|
| 反斜杠加换行全被忽略 | |
| 反斜杠 ( | |
| 单引号 ( | |
| 双引号 ( | |
| ASCII 响铃 (BEL) | |
| ASCII 退格 (BS) | |
| ASCII 进纸 (FF) | |
| ASCII 换行 (LF) | |
| ASCII 回车 (CR) | |
| ASCII 水平制表 (TAB) | |
| ASCII 垂直制表 (VT) | |
| 八进制数 ooo 码位的字符 | (1,3) |
| 十六进制数 hh 码位的字符 | (2,3) |
仅在字符串字面值中可用的转义序列如下:
转义序列 | 意义 | 注释 |
---|---|---|
| Unicode 数据库中名称为 name 的字符 | (4) |
| 16位十六进制数 xxxx 码位的字符 | (5) |
| 32位16进制数 xxxxxxxx 码位的字符 | (6) |
注释:
与标准 C 一致,接受最多三个八进制数码。
与标准 C 不同,要求必须为两个十六进制数码。
在字节串字面值中,十六进制数和八进制数转义码以相应数值代表每个字节。在字符串字面值中,这些转义码以相应数值代表每个 Unicode 字符。
在 3.3 版更改: 加入了对别名 1 的支持。
要求必须为四个十六进制数码。
此方式可用来表示任意 Unicode 字符。要求必须为八个十六进制数码。
与标准 C 不同,所有无法识别的转义序列将原样保留在字符串中,也就是说,反斜杠会在结果中保留。(这种方式在调试时很有用: 如果输错了一个转义序列,更容易在输出结果中识别错误。) 另外要注意的一个关键点是:专用于字符串字面值中的转义序列如果在字节串字面值中出现,会被归类为无法识别的转义序列。
在 3.6 版更改: 无法识别的转义序列将引发
DeprecationWarning
。 在某个未来的 Python 版本中它们将引发SyntaxWarning
并最终将改为引发SyntaxError
。
即使在原始字面值中,引号也可以加上反斜杠转义符,但反斜杠会保留在输出结果中;例如 r"\""
是一个有效的字符串字面值,包含两个字符: 一个反斜杠和一个双引号;而 r"\"
不是一个有效的字符串字面值 (即便是原始字符串也不能以奇数个反斜杠结束)。特别地,一个原始字面值不能以单个反斜杠结束 (因为此反斜杠会转义其后的引号字符)。还要注意一个反斜杠加一个换行在字面值中会被解释为两个字符,而 不是 一个连续行。