处理客户输入我们经常使用
strip()
方法。如果我们想从某个特定集合中删除开始结束符号,我们只需将其全部放入参数中即可。".yes' ".strip(". '")
显然给出了
'yes'
字符串作为结果。' ".
时,结果取决于此符号顺序。当末尾带有符号 ".yes' ".strip(""" ."'""")
的变体给出 "
时,变体 SyntaxError: unterminated string literal (detected at line 1)
可以正常工作。
所以问题是:“为什么文字字符串
"""""""
(使用七个引号)给出错误?它是一样的'"'!"
更新1。他们说我对文字的心理模型是错误的。所以让我们看看文档:
还有。单击此处进行验证。所以
longstring
即"""longstringitem"""
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 语言规范围绕 字符串词法分析所记录的行为:
在三引号文字中,允许(并保留)未转义的换行符和引号,除非连续三个未转义的引号终止文字。 (“引号”是用于打开文字的字符,即 ' 或 "。)
这里的关键点是“连续三个未转义的引号终止文字”。因此,如果您以
"""
开始一个文字,那么一旦遇到另一个 """
序列,该文字就会结束:解析器不会先行查找以尝试推断该文字的不同端点。
当解析器遇到
"""""""
(连续七个双引号)时,因此:
"
,后面没有可以与之配对的 "
,因此第 7 个字符构成一个未终止的文字。解析器失败并显示 SyntaxError: unterminated string literal
。值得一提的是,反斜杠转义仍然可以用来防止引号字符被视为引号。例如:
s = """\""""
print(s)
打印:
"
这种行为是由 python 解析器中一个有趣的事情决定的。您可以在这里阅读。
在 114 号线附近您会看到:
# Tail end of """ string.
Double3 = r'[^"\\]*(?:(?:\\.|"(?!""))[^"\\]*)*"""'
这部分代码定义了三重四分文字的正则表达式。我们可以看到,单独的
"
是允许的,但如果它后面没有另一个 "
。所以逻辑上它是允许的,但这个正则表达式禁止它。
这是我问题的正确答案。但谁在乎呢......
不幸的是,我没有回答为什么这样一个带有四个尾部撇号的字面实现的问题,而是回答了“如何使用转义来实现字面”这个问题,或者大约这样回答 - “因为它是这样实现的” 。在我看来,我已经找到了答案。这种方式的实现是由于 Python 中的另一种操作,即不使用“+”符号连接两个文字。例如,“F”“A”==“F”“A”==“FA”。因此,连续 8 个撇号“”“”“”“”的文字可能会有不同的解释。顺便说一句,令人惊讶的是,现在 8" 不会生成错误,而是返回一个空文字。
如果你认为我的想法正确,请给我的问题加分,因为即使在文档中,我仍然因为这种对Python完全逻辑的愿望的态度而感到痛苦。