为什么文字字符串 """"""" (七个引号)会出错?[重复]

问题描述 投票:0回答:2

处理客户输入我们经常使用

strip()
方法。如果我们想从某个特定集合中删除开始结束符号,我们只需将其全部放入参数中即可。
代码

".yes' ".strip(". '")

显然给出了

'yes'
字符串作为结果。
当我尝试删除集合
' ".
时,结果取决于此符号顺序。当末尾带有符号
".yes' ".strip(""" ."'""")
的变体给出
"
时,变体
SyntaxError: unterminated string literal (detected at line 1)
可以正常工作。

所以问题是:“为什么文字字符串

"""""""
(使用七个引号)给出错误?它是一样的
'"'!"

更新1。他们说我对文字的心理模型是错误的。所以让我们看看文档:

三引号:'''三个单引号''',"""三个双引号"""

还有。单击此处进行验证。所以

  1. longstring
    """longstringitem"""
  2. longstringitem
    可能是单个字符。

那么我们是否必须重写文档或解释器?

更新2.我建议重写解释器的逻辑。因为我的示例从

"""
开始,以
"""
结束,并且里面有一个符号。它与
'''
不同,因为
''
之间必须使用相同的符号
'
。我没有在
"""
"""
对内使用
"""
。看到区别了吗?

更新3.我已经在Python文档问题上注册了我的问题。可以看到这里

更新4.我已将答案标记为答案,因为我保证会这样做))。但文档中的文字确实说:
这是错误的:

'''

这是错误的:
"""

这是错误的:
"""""""""

我同意。但文档中没有任何地方说:

"""""""
错了。这就是我想说的。

没有正式的规则。

更新了5.

In[5] :""""TEXT" """
Out[5]: '"TEXT" '

In[6] :""""TEXT""""
  File "C:\Users\vasil\AppData\Local\Temp\ipykernel_5516\2295884511.py", line 1
    """"TEXT""""
                ^
SyntaxError: EOL while scanning string literal

即行“””中的 4 在开始时允许,在结束时禁止。这是正确的情况吗?

python string literals
2个回答
5
投票

这反映了根据 Python 语言规范围绕 字符串词法分析所记录的行为:

在三引号文字中,允许(并保留)未转义的换行符和引号,除非连续三个未转义的引号终止文字。 (“引号”是用于打开文字的字符,即 ' 或 "。)

这里的关键点是“连续三个未转义的引号终止文字”。因此,如果您以

"""
开始一个文字,那么一旦遇到另一个
"""
序列,该文字就会结束:解析器不会先行查找以尝试推断该文字的不同端点。

当解析器遇到

"""""""
(连续七个双引号)时,因此:

  1. 第一个、第二个和第三个字符告诉解析器它正在处理由三个双引号分隔的文字。
  2. 第四个、第五个和第六个字符构成了“三个未转义的引号”,因此它们终止了文字。
  3. 第 7 个字符是
    "
    ,后面没有可以与之配对的
    "
    ,因此第 7 个字符构成一个未终止的文字。解析器失败并显示
    SyntaxError: unterminated string literal

值得一提的是,反斜杠转义仍然可以用来防止引号字符被视为引号。例如:

s = """\""""
print(s)

打印:

"

0
投票

这种行为是由 python 解析器中一个有趣的事情决定的。您可以在这里阅读。

在 114 号线附近您会看到:

# Tail end of """ string.
Double3 = r'[^"\\]*(?:(?:\\.|"(?!""))[^"\\]*)*"""'

这部分代码定义了三重四分文字的正则表达式。我们可以看到,单独的

"
是允许的,但如果它后面没有另一个
"
。所以逻辑上它是允许的,但这个正则表达式禁止它。

这是我问题的正确答案。但谁在乎呢......

不幸的是,我没有回答为什么这样一个带有四个尾部撇号的字面实现的问题,而是回答了“如何使用转义来实现字面”这个问题,或者大约这样回答 - “因为它是这样实现的” 。在我看来,我已经找到了答案。这种方式的实现是由于 Python 中的另一种操作,即不使用“+”符号连接两个文字。例如,“F”“A”==“F”“A”==“FA”。因此,连续 8 个撇号“”“”“”“”的文字可能会有不同的解释。顺便说一句,令人惊讶的是,现在 8" 不会生成错误,而是返回一个空文字。

如果你认为我的想法正确,请给我的问题加分,因为即使在文档中,我仍然因为这种对Python完全逻辑的愿望的态度而感到痛苦。

© www.soinside.com 2019 - 2024. All rights reserved.