引号中的引号

Quotes within quotes

在Python 3.x:

    print(""s"")       # SyntaxError
    print("""s""")     # prints s
    print(""""s"""")   # SyntaxError
    print("""""s""""") # prints ""s

当字符串中有不同数量的双引号时,这种不同行为背后的原因是什么?

在 Python 中,您可以使用 """...""" 创建多行字符串。引用 documentation for strings,

String literals can span multiple lines. One way is using triple-quotes: """...""" or '''...'''.

在你的第一种情况下""s""是这样解析的

"" (empty string literal)  s  "" (empty string literal)

现在,Python 不知道如何处理 s。这就是为什么 SyntaxError.

失败的原因

在你的第三种情况中,字符串是这样解析的

"""  "s  """ (End of multiline string)  `"`

现在最后一个 " 没有匹配的 "。这就是它失败的原因。

最后一种情况"""""s"""""是这样解析的

"""  ""s  """  ""

所以,多行字符串被成功解析,然后它旁边有一个空字符串文字。在 Python 中,您可以将两个字符串文字并排连接起来,就像这样

print ("a" "b")
# ab

因此,最后一个空字符串文字与 ""s.

连接

从 C 继承的字符串文字连接规则对此负责。考虑一下:

x = "a" "b"

根据 Python 语法,两个字符串合二为一。

另一个方面是三引号字符串(用于多行字符串,如 doc 字符串)也存在,这进一步使问题复杂化。在那里,开始的三重引号与下一个三重引号匹配。

现在,考虑一下您的情况,将每个双引号或三引号组合在一起。您会发现,在一种情况下,您在中间有一个标记 s,有时 s 是字符串的一部分,有时在末尾有剩余的引号等。

要理解这一点,您需要了解两件事:

  1. 除了常规字符串 "foo" Python 还有 多行字符串 ,用 three 打开和关闭引用 """foo"""(参见 String Literals);和
  2. 连续的字符串文字被连接起来 "foo" "bar" == "foobar"(参见 String Literal Concatenation)。

至于你的四个例子:

""s""

s 出现之前关闭单引号,因此等同于:

x = ""
x s x

这显然没有意义。

"""s"""

是一个单字符的多行字符串。

""""s""""

是一个多行字符串,包含两个字符 ("s),后跟一个不匹配的引号。

"""""s"""""

是一个多行字符串,包含三个字符 (""s) 连接到一个空字符串文字。