Python三重字符串引号声明
我用三重字符串的方式如下:
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