引号内的报价

时间:2015-06-14 07:11:11

标签: python string python-3.x double-quotes

在Python 3.x中:

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

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

3 个答案:

答案 0 :(得分:6)

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

  

字符串文字可以跨越多行。一种方法是使用三引号:"""..."""'''...'''

在您的第一种情况中,""s""被解析为

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

现在,Python不知道如何处理s。这就是SyntaxError失败的原因。

在你的第三种情况中,字符串被解析为

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

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

在最后一种情况中,"""""s"""""被解析为

"""  ""s  """  ""

因此,多线字符串被成功解析,然后您旁边有一个空字符串文字。在Python中,您可以通过将它们彼此相邻地连接起来来连接两个字符串文字,就像这样

print ("a" "b")
# ab

因此,最后一个空字符串文字与""s连接。

答案 1 :(得分:3)

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

  1. 与常规字符串"foo"一样,Python有多行字符串,使用三个引号"""foo"""打开和关闭(请参阅String Literals });和
  2. 连续字符串文字连接"foo" "bar" == "foobar"(请参阅String Literal Concatenation)。
  3. 至于你的四个例子:

    ""s""
    

    s出现之前关闭单引号,因此相当于:

    x = ""
    x s x
    

    这显然毫无意义。

    """s"""
    

    是一个多行字符串,其中包含一个字符。

    """"s""""
    

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

    """""s"""""
    

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

答案 2 :(得分:1)

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

x = "a" "b"

根据Python语法,两个字符串连接成一个字符串。

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

现在,请考虑您的案例是轻量级,并将每个双引号或三重引号分组。您会发现,在一个案例中,您在中间有一个令牌s,有时s是字符串的一部分,有时末尾有剩余的引号等。