在Python字符串字面值中引用反斜杠

79

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

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

所以,我想要的是 baz "\",但实际得到的是baz ""。如果我尝试转义反斜杠,也没有帮助:

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

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


尽管这个问题很受欢迎,但实际上这是一个相当糟糕的问题形式 - 有两个完全不同的问题:1.为什么单反斜杠代码不能产生反斜杠?2.为什么双反斜杠代码在输出中显示两个反斜杠(尽管字符串实际上只包含一个反斜杠)?我们现在已经有了良好的规范解答。请使用它们来关闭未来的问题,而不是这个问题。 - Karl Knechtel
5个回答

110

你被输出结果误导了 -- 你采用的第二种方法实际上已经达到了你想要的效果,只是你不相信罢了。 :)

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

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

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

1
Python交互式解释器在将foo = '\\'输出为'\\'(包括转义字符)是否存在某种错误?因为当您转义其他字符时,例如foo ='\"'会产生'"'(不带转义字符)的输出。 - Jaime Hablutzel
2
@JaimeHablutzel,不,这不是一个错误。'"''\"'一样都是描述只有一个"字符的字符串的有效方式。相比之下,'\'不是描述单个反斜杠字符的有效方式(因为孤立的斜杠看起来像是转义了后面的'),所以在非原始字符串中,必须对孤立的反斜杠进行转义。 - Charles Duffy

50

使用原始字符串:

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

请注意,尽管看起来不对,但它实际上是正确的。字符串foo中仅有一个反斜杠。
这是因为当您仅在提示符处键入foo时,Python会显示字符串上__repr__()的结果。这将导致以下结果(请注意,打印的字符串只有一个反斜杠且没有引号):
>>> 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)

这将节省很多转义和掉发的烦恼。阅读这个页面可以帮助你更好地理解。

1
如果您像Charles Duffy上面所做的那样打印,它将正确显示。当您只使用"foo"时,Python会使用__repr__()函数来显示字符串。它会输出一个额外的反斜杠,以便当您将结果分配给变量时,内容将是相同的。 - Kamil Kisiel

5
哈雷说的话,除了最后一点——在调用open之前将“/”更改为“\”实际上并不是必需的。Windows可以愉快地接受带有正斜杠的路径。
infile = open('c:/folder/subfolder/file.txt')

只有当您通过shell(使用os.systemsubprocess模块)将其传递给另一个程序时,您才可能需要规范化字符串。


1

如果您需要文件路径,请使用"\\"

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

这将输出c:\file\path


1
请注意,这是特定于Windows的。在Linux / macOS上,这将导致“c:\ file \ path”。 - austin_ce
对于我来说,即使我在Windows上工作,我仍然得到双反斜杠! - undefined

-1

以反斜杠结尾字符串的另一种方法是在字符串末尾加上反斜杠和一个空格,然后调用 .strip() 函数。

我试图将两个字符串变量连接起来,并用反斜杠将它们分隔开,所以我使用了以下代码:

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

1
这段代码之所以能够运行,是因为 "\ " 不是一个有效的转义序列,所以反斜杠保留在字符串中。尝试使用 "\n".strip("n") 并查看差异。如果 Python 的下一个版本将反斜杠空格定义为有效的单个字符,则此代码将无法正常工作。 - Mark Ransom
2
最好使用 r"\ ".strip() 或者 r"\ "[:-1] - alexia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接