2.4.1. 字符串和字节串字面值

字符串字面值由以下词法定义进行描述:

  1. stringliteral ::= [stringprefix](shortstring | longstring)
  2. stringprefix ::= "r" | "u" | "R" | "U" | "f" | "F"
  3. | "fr" | "Fr" | "fR" | "FR" | "rf" | "rF" | "Rf" | "RF"
  4. shortstring ::= "'" shortstringitem* "'" | '"' shortstringitem* '"'
  5. longstring ::= "'''" longstringitem* "'''" | '"""' longstringitem* '"""'
  6. shortstringitem ::= shortstringchar | stringescapeseq
  7. longstringitem ::= longstringchar | stringescapeseq
  8. shortstringchar ::= <any source character except "\" or newline or the quote>
  9. longstringchar ::= <any source character except "\">
  10. stringescapeseq ::= "\" <any source character>
  1. bytesliteral ::= bytesprefix(shortbytes | longbytes)
  2. bytesprefix ::= "b" | "B" | "br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB"
  3. shortbytes ::= "'" shortbytesitem* "'" | '"' shortbytesitem* '"'
  4. longbytes ::= "'''" longbytesitem* "'''" | '"""' longbytesitem* '"""'
  5. shortbytesitem ::= shortbyteschar | bytesescapeseq
  6. longbytesitem ::= longbyteschar | bytesescapeseq
  7. shortbyteschar ::= <any ASCII character except "\" or newline or the quote>
  8. longbyteschar ::= <any ASCII character except "\">
  9. bytesescapeseq ::= "\" <any ASCII character>

这些条目中未提及的一个语法限制是 stringprefixbytesprefix 与字面值的剩余部分之间不允许有空白。源字符集是由编码声明定义的;如果源文件中没有编码声明则默认为 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 中的转义规则来解读。可用的转义序列如下:

转义序列

意义

注释

\newline

反斜杠加换行全被忽略

\

反斜杠 (\)

\’

单引号 ()

\”

双引号 ()

\a

ASCII 响铃 (BEL)

\b

ASCII 退格 (BS)

\f

ASCII 进纸 (FF)

\n

ASCII 换行 (LF)

\r

ASCII 回车 (CR)

\t

ASCII 水平制表 (TAB)

\v

ASCII 垂直制表 (VT)

\ooo

八进制数 ooo 码位的字符

(1,3)

\xhh

十六进制数 hh 码位的字符

(2,3)

仅在字符串字面值中可用的转义序列如下:

转义序列

意义

注释

\N{name}

Unicode 数据库中名称为 name 的字符

(4)

\uxxxx

16位十六进制数 xxxx 码位的字符

(5)

\Uxxxxxxxx

32位16进制数 xxxxxxxx 码位的字符

(6)

注释:

  1. 与标准 C 一致,接受最多三个八进制数码。

  2. 与标准 C 不同,要求必须为两个十六进制数码。

  3. 在字节串字面值中,十六进制数和八进制数转义码以相应数值代表每个字节。在字符串字面值中,这些转义码以相应数值代表每个 Unicode 字符。

  4. 在 3.3 版更改: 加入了对别名 1 的支持。

  5. 要求必须为四个十六进制数码。

  6. 此方式可用来表示任意 Unicode 字符。要求必须为八个十六进制数码。

与标准 C 不同,所有无法识别的转义序列将原样保留在字符串中,也就是说,反斜杠会在结果中保留。(这种方式在调试时很有用: 如果输错了一个转义序列,更容易在输出结果中识别错误。) 另外要注意的一个关键点是:专用于字符串字面值中的转义序列如果在字节串字面值中出现,会被归类为无法识别的转义序列。

在 3.6 版更改: 无法识别的转义序列将引发 DeprecationWarning。 在某个未来的 Python 版本中它们将引发 SyntaxWarning 并最终将改为引发 SyntaxError

即使在原始字面值中,引号也可以加上反斜杠转义符,但反斜杠会保留在输出结果中;例如 r"\"" 是一个有效的字符串字面值,包含两个字符: 一个反斜杠和一个双引号;而 r"\" 不是一个有效的字符串字面值 (即便是原始字符串也不能以奇数个反斜杠结束)。特别地,一个原始字面值不能以单个反斜杠结束 (因为此反斜杠会转义其后的引号字符)。还要注意一个反斜杠加一个换行在字面值中会被解释为两个字符,而 不是 一个连续行。