Python如何将单个反斜杠替换为双反斜杠?

69
在Python中,我想将一个反斜杠(“\”)替换为两个反斜杠(“\\”)。我有以下代码:

在Python中,我试图用双反斜杠(“\\”)替换单个反斜杠(“\”)。我有以下代码:

directory = string.replace("C:\Users\Josh\Desktop\20130216", "\", "\\")

然而,这会给出一个错误消息,指出它不喜欢双反斜杠。有人能帮忙吗?


它也不会喜欢单个反斜杠。 - Ryan Haining
退格键是一个转义字符。你不能单独使用它。 - Santa
你也可以使用正斜杠,可能更容易些。 - squiguy
3
我不理解这个问题的意义。另外,为什么一个对转义字符基本的误解值得 50 分赏金? - Tim Seguine
3
只是想得到更多/更好的建议,因为这些建议并不能解决我的问题。想试一试,避免提出全新的问题。 - Demis
显示剩余3条评论
9个回答

84

这里不需要使用 str.replace 或者 string.replace,只需将该字符串转换为原始字符串:

>>> strs = r"C:\Users\Josh\Desktop\20130216"
           ^
           |
       notice the 'r'

以下是上述字符串的repr版本,这就是为什么您在这里看到\\

但实际上,实际字符串只包含'\',而不是\\

>>> strs
'C:\\Users\\Josh\\Desktop\\20130216'

>>> s = r"f\o"
>>> s            #repr representation
'f\\o'
>>> len(s)   #length is 3, as there's only one `'\'`
3

但是,当您打印此字符串时,输出中将不会显示 '\\'

>>> print strs
C:\Users\Josh\Desktop\20130216

如果你希望在 print 中显示字符串 '\\' ,那么可以使用 str.replace

>>> new_strs = strs.replace('\\','\\\\')
>>> print new_strs
C:\\Users\\Josh\\Desktop\\20130216

repr 版本现在将显示 \\\\

>>> new_strs
'C:\\\\Users\\\\Josh\\\\Desktop\\\\20130216'

1
你如何确保现有的'\'不会被加倍?例如,您只想在“print”版本中最多使用双反斜杠? - Demis
@Demis 你能给一个例子吗? - Ashwini Chaudhary
1
我有一个脚本,其中我需要存储的文件路径包含双反斜杠(以发送到需要转义的程序),但输入文件路径有时已经包含此内容(由用户/Python脚本提供),有时不包含(仅包含单反斜杠)。我想对输入进行清理,以确保所有单个反斜杠都转换为两个反斜杠。例如,如果用户了解程序的语法,则可能会提供两个反斜杠,但如果他们不了解,则会提供单个反斜杠。我可以始终要求只使用单个反斜杠,但认为正确清理这两种情况可能不会太难。 - Demis
4
看一下_os.path.normpath(path)_函数,它可以去除所有重复的反斜杠。然后,将单个反斜杠替换为双反斜杠。 - Cerno
在Windows CMD Python shell中,使用r前缀来粘贴路径非常方便。 - lucidbrot
1
感谢Demis和@Cerno。其他答案使用'r'前缀字符串或re正则表达式库回答了最初的问题。但我正在寻找如何处理用户输入()。使用os.path.normalpath()正是我所需要的。 - Glenn Wark

25

让我来简单明了地解释一下。我们可以使用Python中的re模块来转义特殊字符。

Python脚本:

import re
s = "C:\Users\Josh\Desktop"
print s
print re.escape(s)

输出:

C:\Users\Josh\Desktop
C:\\Users\\Josh\\Desktop
说明:

现在观察一下对于给定字符串中的特殊字符,re.escape 函数在转义时我们可以在每个反斜杠前面添加另一个反斜杠,最终输出结果是双反斜杠,这正是我们需要的输出结果。

希望这能帮到您。


请在您的代码中提供一些上下文和解释。同时,请检查您的代码格式。 - James K
1
太好了,有一个函数可以为你完成这个操作!这正是我所需要的,而且比四个反斜杠要漂亮得多。确实简单明了。 - Demis
1
re.escape同样会转义.,所以print(re.escape('bob.txt'))输出'bob.txt'。转义旨在将任意字符串转义为正则表达式中使用的字符串。它不是用于转义文件路径的。 - Brian C.
在我的情况下,这也转义了 :,变成了 \:,导致路径无法工作 :-( - lenooh
在3.x中,s = "C:\Users\Josh\Desktop"已经是语法错误了,因为\U开始了一个8位十六进制Unicode转义字符。(在2.x中,这只能在带有u前缀的字符串中或者使用from __future__ import unicode_literals时才能被识别。) - Karl Knechtel
显示剩余3条评论

9

使用转义字符:"full\\path\\here""\\""\\\\"

(这段文字提醒读者在编写代码时需要注意转义字符的使用,其中包括双反斜杠 "\\" 转义成单个反斜杠 "\" 的情况。)

1
Python的词法解析方式,r"\"r"\\"不会按照你的预期工作。 - Santa
r'\' 是不正确的,这会引发 EOF 错误,因为你实际上是在转义闭合引号。 - Ashwini Chaudhary
3
如何打印一个单独的反斜杠“\”? - 8.8.8.8

3
在Python中,反斜杠 \ 被用作转义字符。这意味着在您希望插入特殊字符(例如换行符)的位置,您需要使用反斜杠和另一个字符(\n 代表换行符)。
使用您的示例字符串,您会注意到当您将 "C:\Users\Josh\Desktop\20130216" 放入 REPL 中时,您会得到 "C:\\Users\\Josh\\Desktop\x8130216"。这是因为在 Python 字符串中,\2 具有特殊含义。如果您希望指定 \,则需要在字符串中放置两个 \\

"C:\\Users\\Josh\\Desktop\\28130216"

另一种选择是通过在字符串前面添加 r 来通知 Python 您的整个字符串不能使用 \ 作为转义字符。

r"C:\Users\Josh\Desktop\20130216"

这是一个“原始”字符串,在需要使用许多反斜杠的情况下非常有用,例如正则表达式字符串。
如果您仍然希望用 \\ 替换单个 \,则可以使用:

directory = string.replace(r"C:\Users\Josh\Desktop\20130216", "\\", "\\\\")

请注意,上面最后两个字符串中我没有使用 r'。这是因为当您使用字符串的 r' 形式时,不能以单个反斜杠结尾。 为什么 Python 的原始字符串文字不能以单个反斜杠结束? https://pythonconquerstheuniverse.wordpress.com/2008/06/04/gotcha-%E2%80%94-backslashes-are-escape-characters/

2
也许是您的情况中出现了语法错误,您可以将该行更改为:
directory = str(r"C:\Users\Josh\Desktop\20130216").replace('\\','\\\\')

这将为您提供正确的输出结果:

C:\\Users\\Josh\\Desktop\\20130216

2

反斜杠表示特殊的转义字符。因此,directory = path_to_directory.replace("\\", "\\\\")会导致Python认为replace函数的第一个参数直到第二个参数的起始引号才结束,因为它将结尾引号理解为转义字符。

directory=path_to_directory.replace("\\","\\\\")

0

给定源字符串,使用os.path进行操作可能更有意义,但这里提供了一个字符串解决方案;

>>> s=r"C:\Users\Josh\Desktop\\20130216"
>>> '\\\\'.join(filter(bool, s.split('\\')))
'C:\\\\Users\\\\Josh\\\\Desktop\\\\20130216'

请注意,{{link1:split}}将源字符串中的\\视为分隔的空字符串。使用filter可以去除这些空字符串,因此join不会使已经加倍的反斜杠再次加倍。不幸的是,如果您有3个或更多,则它们会被减少为双倍反斜杠,但我认为这不会影响您在Windows路径表达式中的使用。

-1
你可以使用


os.path.abspath(path_with_backlash)

它返回带有 \ 的路径。

-3

使用:

string.replace(r"C:\Users\Josh\Desktop\20130216", "\\", "\\")

转义 \ 字符。


1
你的最后一个参数应该是 "\\\\" - Santa
我认为你的意思是将最后一个改为r'\\''\\\\' - Ryan Haining
2
使用原始字符串然后应用替换的意义是什么? - Ashwini Chaudhary
我相信Python解析的方式,r'\\'并不像你期望的那样工作。 - Santa

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