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

80 投票
5 回答
280280 浏览
提问于 2025-04-11 19:16

我有一个字符串,这个字符串里面包含了双引号和反斜杠,我想把它赋值给一个变量在Python里。但是每次我尝试赋值的时候,这些引号或者斜杠要么被删掉了,要么被转义了。举个例子:

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

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

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

这样虽然和我输入的匹配了,但这并不是我最开始想要的。那我该怎么解决这个问题呢?

5 个回答

5

哈雷说的都对,除了最后一点——其实在调用打开文件之前,不需要把'/'改成'\'。Windows系统可以接受带有正斜杠的路径。

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

你只有在通过命令行把路径传给另一个程序时(比如用os.system或者subprocess模块),才可能需要用到字符串normpathed。

53

使用原始字符串:

>>> 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)

这样可以省去很多转义的麻烦,避免让人抓狂。这篇文章 在我之前遇到这个问题时很有帮助。

114

你被输出结果给误导了——你采取的第二种方法其实是能达到你想要的效果,只是你不相信而已。 :)

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

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

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

撰写回答