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

Vas*_*ets -7 python string literals

处理客户的输入我们经常使用该strip()方法。如果我们想从某个特定集合中删除起始符号,我们只需将其全部放入参数中即可。

代码:

".yes' ".strip(". '")
Run Code Online (Sandbox Code Playgroud)

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

为什么文字字符串"""""""(使用七个引号)会出错?都是一样的'"'!"

让我们看一下文档:

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

语言参考

单击此处进行验证。所以

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

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

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

slo*_*rop 6

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

\n
\n

在三引号文字中,允许(并保留)未转义的换行符和引号,但连续三个未转义的引号终止文字。(\xe2\x80\x9cquote\xe2\x80\x9d 是用于打开文字的字符,即 \' 或 "。)

\n
\n

这里的关键点是“连续三个未转义的引号终止文字”。因此,如果您以 开始文字""",则一旦"""遇到另一个序列,该文字就会结束:解析器不会提前查看以尝试推断文字的不同端点。

\n

当解析器遇到"""""""(连续七个双引号)时,因此:

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

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

\n
s = """\\""""\nprint(s)\n
Run Code Online (Sandbox Code Playgroud)\n

印刷:

\n
"\n
Run Code Online (Sandbox Code Playgroud)\n

  • 文档中的语法只有部分是“正式的”。问题中引用的最后 3 个作品部分是非正式的。doc 语法不是也不可能是用于定义解析器的语法。这是一个人类可读的版本,*必须阅读*以及下面的解释。解释以“这些产生式未指示的一个语法限制......”开始。另一个是引用的“slothrop”段落,它将 7 个引号定义为无效。 (4认同)