Python三重字符串引号声明

1 投票
3 回答
779 浏览
提问于 2025-04-17 13:04

我用三重字符串的方式如下:

str="""jeff"""
str=""""jeff"""
str=""""jeff""""   # error
str=""""jeff """"

第三个是错误的,谁能解释一下为什么会出错呢?

3 个回答

0

str="""jeff""" --> 这个表示一个字符串 'jeff'

str=""""jeff""" --> 这个表示一个多行字符串 'jeff'

str=""""jeff"""" # 错误 --> 这里解析器认为你在声明 "", "", jeff, "", ""

str=""""jeff """" # 错误 --> 和上一个情况一样

>>> """"a""""
  File "<stdin>", line 1
    """"a""""
            ^
SyntaxError: EOL while scanning string literal
>>> """"a """"
  File "<stdin>", line 1
    """"a """"
             ^
SyntaxError: EOL while scanning string literal

为了避免这个问题,可以这样写 """\"a \""""

另外,正如 tng345 提到的,你可以查看 BNF

1

只用三个引号。

第二个字符串被理解为: "jeff

第三个字符串被理解为: "jeff,后面跟着一个多余的引号。

6

三个引号可以结束一个字符串,所以这个

str=""""jeff""""

会被解析成这个:

str= """ ("jeff) """ (")

问题出在最后的引号上。

顺便提一下,查看一下 BNF定义

longstring      ::=  "'''" longstringitem* "'''"
                     | '"""' longstringitem* '"""'

可以明显看出星号 * 是非贪婪的,不过我不确定这个是否有地方说明。

针对评论,这个

 str = ''''''''jeff'''

会被解释为

(''')(''')('')(jeff)(''') <-- error, two quotes

而这个

 str = '''''''''jeff'''

会被解释为

 str = (''')(''')(''')(jeff)(''') <-- no error, empty string + jeff

撰写回答