在Python字符串文字中引用反斜杠

Chr*_*nch 54 python string

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

>>> foo = 'baz "\"'
>>> foo
'baz ""'
Run Code Online (Sandbox Code Playgroud)

所以,而不是baz "\"像我想要的那样baz "".如果我然后试图逃避反斜杠,它也没有帮助:

>>> foo = 'baz "\\"'
>>> foo
'baz "\\"'
Run Code Online (Sandbox Code Playgroud)

现在哪个符合我的要求但不是我原本想要的.你是如何解决这个问题的?

Cha*_*ffy 74

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

>>> foo = 'baz "\\"'
>>> foo
'baz "\\"'
>>> print foo
baz "\"
Run Code Online (Sandbox Code Playgroud)

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

>>> print r'baz "\"'
baz "\"
Run Code Online (Sandbox Code Playgroud)

  • @JaimeHablutzel,不,这不是一个错误。`'"'` 与 `'\"'` 一样是用单个 `"` 字符描述字符串的有效方法。相比之下,`'\'` **不是**描述字符串的有效方法。单个反斜杠字符(因为单独的斜杠看起来像是转义后面的“'”),因此非原始字符串中的单独反斜杠**必须**被转义。 (2认同)

Har*_*mbe 27

使用原始字符串:

>>> foo = r'baz "\"'
>>> foo
'baz "\\"'
Run Code Online (Sandbox Code Playgroud)

请注意,虽然它看起来不对,但它确实是正确的.字符串中只有一个反斜杠foo.

发生这种情况是因为当您只是foo在提示符处键入时,python会__repr__()在字符串上显示结果.这导致以下内容(注意只有一个反斜杠,并且printed字符串周围没有引号):

>>> foo = r'baz "\"'
>>> foo
'baz "\\"'
>>> print foo
baz "\"
Run Code Online (Sandbox Code Playgroud)

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

>>> foo = r'baz \'
  File "<stdin>", line 1
    foo = r'baz \'
                 ^  
SyntaxError: EOL while scanning single-quoted string
Run Code Online (Sandbox Code Playgroud)

执行此操作时,原始字符串无法正常工作.你必须使用常规字符串并转义反斜杠:

>>> foo = 'baz \\'
>>> print foo
baz \
Run Code Online (Sandbox Code Playgroud)

但是,如果您正在使用Windows文件名,那么您会遇到一些痛苦.你想要做的是使用正斜杠和os.path.normpath()函数:

myfile = os.path.normpath('c:/folder/subfolder/file.txt')
open(myfile)
Run Code Online (Sandbox Code Playgroud)

这将节省大量的逃避和头发撕裂. 这个页面在前一段时间内很方便.


bab*_*unk 5

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

infile = open('c:/folder/subfolder/file.txt')
Run Code Online (Sandbox Code Playgroud)

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