【问题标题】:Having both single and double quotation in a Python string在 Python 字符串中同时包含单引号和双引号
【发布时间】:2011-09-20 14:46:29
【问题描述】:

我正在尝试在 Python 中创建一个包含单引号和双引号的字符串('")。但是,Python 总是自动将其更正为 (\', ")。我想知道是否有办法将双引号和单引号原样放在一起。

【问题讨论】:

  • 你的意思是反斜杠在你打印的时候有,还是只有你在解释器里看的时候才有反斜杠?
  • “python 总是自动更正”?在哪里?如何?请print 输出确定你得到什么。请注意,您从 repr() 看到的内容和您在 >>> 提示符看到的内容与字符串中的 actually 内容不匹配。 repr()>>> 版本是 Python 源代码。不是实际值。请用具体示例更新您的问题。

标签: python string


【解决方案1】:

使用三引号。

"""Trip'le qu"oted"""

'''Ag'ain qu"oted'''

请记住,仅仅因为 Python reprs 是带有反斜杠的字符串,并不意味着它实际上在字符串中添加了任何斜杠,它可能只是显示特殊字符已转义。

使用 Python 教程中的示例:

>>> len('"Isn\'t," she said.')
18
>>> len('''"Isn't," she said.''')
18

尽管第二个字符串因为没有反斜杠而显得短了一个字符,但它实际上是相同的长度——反斜杠只是为了转义单引号字符串中的单引号。

另一个例子:

>>> for c in '''"Isn't," she said.''':
...     sys.stdout.write(c)
... 
"Isn't," she said.
>>> 

如果你不让 Python 格式化字符串,你可以看到字符串没有被改变,只是 Python 试图明确地显示它。

请参阅tutorial section on strings

【讨论】:

  • 感谢您的回复。但是,当我输入 s = """ ' " """ 时,当我检查 s 的值时,它仍然显示 '\' "'。我将此字符串传递给命令行,所以它必须是 ' ' " '。
  • @GHO 见上面 S.Lott 的评论。
  • @GHO 我想我在答案中解释得很好(我添加了另一个例子)——\ 实际上并不存在(在字符串中),Python 只是用它来显示' 不会结束字符串,而不是开头和结尾的字符串。它实际上并没有改变你的字符串,只是它的显示方式。
  • 一个陷阱,这不包括:如果你的字符串以相同类型的引号结尾,你会增加三倍,所以你有四个连续,Python 会抓住前三个并给你一个“扫描字符串文字时 EOL”为第四个。解决方法是使用相反的三引号"''',以空格结尾" """,或转义结尾引号\""""
【解决方案2】:

使用三引号字符串:

""" This 'string' contains "both" types of quote """
''' So ' does " this '''

【讨论】:

  • 感谢您的回复。但是,正如我上面评论的那样,我仍然遇到问题。顺便说一句,我正在使用 python 2.7
  • @GHO:“还是有问题”。这意味着(1)在问题中发布实际代码。 (2) 发布实际print 语句的实际输出。在问题中。 (3)发布您实际遇到的实际错误。在问题中。遗憾的是,我们无法猜测您使用的是什么代码。
【解决方案3】:

要在 python 上同时添加单引号和双引号,请使用屏蔽(转义)引号。 试试这个例子:

print(" just display ' and \" ")

\" 告诉 python 这不是引用字符串的结尾。

【讨论】:

    【解决方案4】:

    实际的问题是,print() 语句不打印 \,但是当您在解释器中引用字符串的值时,只要使用撇号,它就会显示一个“\”。例如,参考以下代码:

        >>> s = "She said, \"Give me Susan's hat\""
        >>> print(s)
        She said, "Give me Susan's hat"
        >>> s
        'She said, "Give me Susan\'s hat"'
    

    这与您使用单引号、双引号还是三引号将字符串括起来无关。

        >>> s = """She said, "Give me Susan's hat" """
        >>> s
        'She said, "Give me Susan\'s hat" '
    

    包含此内容的另一种方式:

        >>> s = '''She said, "Give me Susan's hat" '''
        >>> s
        'She said, "Give me Susan\'s hat" '
        >>> s =  '''She said, "Give me Susan\'s hat" '''
        >>> s
        'She said, "Give me Susan\'s hat" '
    

    所以基本上,当您引用 s 的值时,python 不会删除 \,而是在您尝试打印时将其删除。尽管如此,当您提到 s 的长度时,它并没有计算“\”。 例如,

        >>> s = '''"''"'''
        >>> s
        '"\'\'"'
        >>> print(s)
        "''"
        >>> len(s)
        4
    

    【讨论】:

    • 对此无能为力吗?因为我试图将字符串作为 bash 命令传递给子进程,而那个额外的反斜杠一直在搞乱执行。
    【解决方案5】:

    这也让我困惑了一天多,但我现在已经消化了。

    首先,让我们了解,如果字符串通过了 DOUBLE 测试,则会输出 DOUBLE 引号:

    1. 包含单引号
    2. 不包含双引号

    这是最容易记住的方式。

    文字"doesn't" 通过了第一个测试,因为撇号算作单引号。然后,我们重新检查它,发现它在外壳内不包含任何双引号。因此,字符串文字输出为双引号:

    >>> "doesn't"
    "doesn't"
    

    没有必要在输出中用反斜杠转义单引号,因为包围是由双引号组成的!

    现在考虑文字'"Isn\'t," they said.' 这个文字通过了第一个测试,因为它包含一个撇号,即使它被转义了。但是,它也包含双引号,因此第二次测试失败。因此,它输出为单引号:

    >>> '"Isn\'t," they said.'
    '"Isn\'t," they said.'
    

    并且因为包围是由单引号组成的,所以输出中需要转义。

    如果不是输出中的反斜杠,则在扫描文字时会到达 EOL(行尾)。

    最后,考虑"\"Isn't,\" they said."

    文字里面有一个单引号,所以它确实通过了第一个测试......但第二个测试失败了。输出应将字符串文字括在单引号中:

    >>> "\"Isn't,\" they said."
    '"Isn\'t," they said.'
    

    因此,需要进行转义以防止提前 EOL。

    【讨论】:

      【解决方案6】:

      您可以 (1) 将字符串括在双引号中并使用 \ 转义双引号或 (2) 将字符串括在单引号中并使用 \ 转义单引号。例如:

      >>> print('She is 5\' 6" tall.')
      She is 5' 6" tall.
      >>> print("He is 5' 11\" tall.")
      He is 5' 11" tall.
      

      【讨论】:

        【解决方案7】:

        在 f-string 中,我不能使用反斜杠。 到时候,使用 chr() 可能是解决办法!

        print(f"- tokenizer: {' '.join(str(type(tokenizer)).split(chr(39))[1:-1])}")
        

        Unicode HOWTO

        【讨论】:

          【解决方案8】:

          虽然比较冗长, 另一种方法是执行以下操作:

          str1 = 'the part that has double "s" in it'
          
          str1 = str1 + " the part that has single 's' in it"
          

          【讨论】:

            【解决方案9】:

            在某些情况下,使用三引号似乎对我不起作用。

            例如,我曾经遇到过如何操作这个脚本以使其更加动态的问题。

            listed = drive.ListFile({'q': "title contains '.mat' and '1GN8xQDTW4wC-dDrXRG00w7CymjI' in parents"}).GetList()
            

            'q':之后的部分,有一个带双引号和单引号的字符串。所以,我打算单独更改文件类型('.mat)和文件夹 ID('1GN...')。

            处理这个问题,我使用.format来操作上面的脚本,把它变成这个

            listed = drive.ListFile({'q': "title contains '{}' and '{}' in parents".format(file_type, folder_id)}).GetList()
            

            如果您无法使用三引号,请提供某些线索。

            干杯!

            【讨论】:

              猜你喜欢
              • 2021-12-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-02-10
              • 1970-01-01
              • 1970-01-01
              • 2011-10-01
              • 1970-01-01
              相关资源
              最近更新 更多