【问题标题】:Quoting backslashes in Python string literals [duplicate]在 Python 字符串文字中引用反斜杠 [重复]
【发布时间】:2010-09-22 23:57:35
【问题描述】:

我有一个包含双引号和反斜杠的字符串,我想将其设置为 Python 中的变量。但是,每当我尝试设置它时,引号或斜杠都会被删除或转义。这是一个例子:

>>> foo = 'baz "\"'
>>> foo
'baz ""'

所以我得到的是baz "",而不是我想要的baz "\"。如果我然后尝试转义反斜杠,它也无济于事:

>>> foo = 'baz "\\"'
>>> foo
'baz "\\"'

现在与我输入的内容相匹配,但不是我最初想要的内容。你如何解决这个问题?

【问题讨论】:

    标签: python string


    【解决方案1】:

    你被输出误导了——你采取的第二种方法实际上是你想要的,你只是不相信它。 :)

    >>> foo = 'baz "\\"'
    >>> foo
    'baz "\\"'
    >>> print(foo)
    baz "\"
    

    顺便说一下,还有另一种字符串形式可能更清楚一点:

    >>> print(r'baz "\"')
    baz "\"
    

    【讨论】:

    • 是 Python 交互式解释器为 foo = '\\' 输出 '\\' (包括转义字符)的事实吗?其他字符,例如foo = '\"' 产生 '"'(没有转义字符)。
    • @JaimeHablutzel,不,这不是错误。 '"' 与描述具有单个 " 字符的字符串一样有效,就像 '\"' 一样。相比之下,'\' 不是描述单个反斜杠字符的有效方式(因为一个单独的斜杠看起来像是在转义后面的 '),所以一个单独的反斜杠在非原始字符串必须被转义。
    【解决方案2】:

    使用原始字符串:

    >>> foo = r'baz "\"'
    >>> foo
    'baz "\\"'
    

    请注意,虽然看起来不对,但实际上是对的。字符串foo 中只有一个反斜杠。

    这是因为当你在提示符下键入foo 时,python 会在字符串上显示__repr__() 的结果。这会导致以下结果(注意只有一个反斜杠,printed 字符串周围没有引号):

    >>> foo = r'baz "\"'
    >>> foo
    'baz "\\"'
    >>> print(foo)
    baz "\"
    

    让我们继续,因为还有更多的反斜杠技巧。如果你想在字符串末尾有一个反斜杠并使用上面的方法你会遇到一个问题:

    >>> foo = r'baz \'
      File "<stdin>", line 1
        foo = r'baz \'
                     ^  
    SyntaxError: EOL while scanning single-quoted string
    

    当您这样做时,原始字符串无法正常工作。您必须使用常规字符串并转义反斜杠:

    >>> foo = 'baz \\'
    >>> print(foo)
    baz \
    

    但是,如果您使用的是 Windows 文件名,则会遇到一些麻烦。您要做的是使用正斜杠和os.path.normpath() 函数:

    myfile = os.path.normpath('c:/folder/subfolder/file.txt')
    open(myfile)
    

    这将节省大量的逃跑和头发撕裂。 This page 前一阵子的时候很方便。

    【讨论】:

    • 如果您像上面的 Charles Duffy 那样打印,它将正确显示。当你只做“foo”时,Python 使用 __repr__() 函数来显示字符串。它的输出带有一个额外的反斜杠,因此当您将结果分配给变量时,内容将是相同的。
    【解决方案3】:

    除了最后一点之外,Harley 所说的 - 实际上没有必要在调用 open 之前将 '/' 更改为 '\'。 Windows 很乐意接受带有正斜杠的路径。

    infile = open('c:/folder/subfolder/file.txt')
    

    您可能需要字符串 normpathed 的唯一情况是您通过 shell 传递给另一个程序(使用 os.systemsubprocess 模块)。

    【讨论】:

      【解决方案4】:

      如果您在这里寻找文件路径,请使用 "\\"

      import os
      path = r"c:\file"+"\\"+"path"
      os.path.normpath(path)
      

      将输出c:\file\path

      【讨论】:

      • 请注意,这是特定于 Windows 的。在 Linux/macOS 上,这将导致 "c:\\file\\path"
      【解决方案5】:

      另一种用反斜杠结束字符串的方法是用反斜杠后跟一个空格来结束字符串,然后对该字符串调用.strip()函数。

      我试图连接两个字符串变量并用反斜杠分隔它们,所以我使用了以下内容:

      newString = string1 + "\ ".strip() + string2
      

      【讨论】:

      • 这行得通的唯一原因是"\ " 不是一个有效的转义序列,所以反斜杠保留在字符串中。试试"\n".strip("n") 看看有什么不同。如果下一版本的 Python 将反斜杠空格定义为有效的单个字符,这将停止工作。
      猜你喜欢
      • 1970-01-01
      • 2013-01-24
      • 1970-01-01
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      • 2022-08-07
      • 1970-01-01
      • 2018-05-06
      相关资源
      最近更新 更多