【问题标题】:python replace single backslash with double backslashpython用双反斜杠替换单反斜杠
【发布时间】:2013-06-24 00:18:58
【问题描述】:

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

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

但是,这会给出一条错误消息,指出它不喜欢双反斜杠。有人可以帮忙吗?

【问题讨论】:

  • 它也不喜欢单反斜杠
  • 退格是escape character。你不能单独使用它。
  • 你也可以不使用正斜杠;对你来说可能更容易。
  • 我不明白这个问题的意义。另外,为什么对转义字符的基本误解应该得到 50 分的赏金?
  • 只是想获得更多/更好的建议,因为这些并不能解决我的问题。认为值得一试,以避免提出全新的问题。

标签: python string replace backslash


【解决方案1】:

此处无需使用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'

【讨论】:

  • 如何确保现有的 '\\' 不会翻倍?例如。您只需要最多双反斜杠(print 版本)?
  • @Demis 你能举个例子吗?
  • 我有一个脚本,我需要存储的文件路径包含双 \\'s(发送到需要此转义的程序),但输入文件路径有时已经包含此(由用户/Python 脚本),有时不包含(仅包含单个-\'s)。我想清理输入以确保所有 \'s 都转换为完全 \\.例如。如果用户知道程序的 \\ 语法,他们可能会提供 \\'s,但如果他们不知道,他们将提供单个 \'s。我可以一直只需要一个-\'s,但认为无论哪种情况,正确清理它都不会太难。
  • @Demis:看看 os.path.normpath(path)。这将删除所有重复的反斜杠。然后,将单反斜杠替换为双反斜杠。
  • 在字符串前面加上r 非常适合将路径粘贴到windows cmd python shell中
【解决方案2】:

让我说得简单明了。让我们使用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 函数对给定字符串中的特殊字符进行转义,我们可以在每个反斜杠之前添加另一个反斜杠,最后输出结果为双反斜杠,即所需的输出.

希望对你有所帮助。

【讨论】:

  • 请提供一些上下文和解释以配合您的代码。还要检查代码的格式。
  • @JamesK 抱歉解释一下。让我更正一下。
  • 有一个功能可以为你做这件事真是太好了!这正是我所需要的,并且比四倍反斜杠更漂亮。确实简单明了。
  • re.escape 不幸的是也转义了空格“\ \ \”
  • re.escape 也逃脱了。所以 print(re.escape('bob.txt') 输出 'bob\.txt' 转义是为了转义要在正则表达式中使用的任意字符串。它不是为了转义文件路径。
【解决方案3】:

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

【讨论】:

  • Python 的词法解析方式,r"\" 或 r"\\" 不会像你期望的那样工作。
  • r'\' 不正确,这将引发EOF 错误,因为您实际上是在转义结束引号。
  • 如何打印单个\?
【解决方案4】:

在 python 中,\(反斜杠)用作转义字符。这意味着在您希望插入特殊字符(例如换行符)的地方,您将使用反斜杠和另一个字符(\n 表示换行符)

使用您的示例字符串,您会注意到当您将"C:\Users\Josh\Desktop\20130216" 放入repl 时,您将得到"C:\\Users\\Josh\\Desktop\x8130216"。这是因为\2 在python 字符串中具有特殊含义。如果你想指定\,那么你需要在你的字符串中加入两个\\。

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

另一种选择是通知python你的整个字符串不能使用\作为转义字符,方法是在字符串前面加上r

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

这是一个“原始”字符串,在需要使用大量反斜杠的情况下非常有用,例如正则表达式字符串。

如果您仍希望将单个 \ 替换为 \\,则可以使用:

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

注意我没有在上面的最后两个字符串中使用r'。这是因为,当您使用 r' 形式的字符串时,您不能以单个 \ 结束该字符串

Why can't Python's raw string literals end with a single backslash?

https://pythonconquerstheuniverse.wordpress.com/2008/06/04/gotcha-%E2%80%94-backslashes-are-escape-characters/

【讨论】:

    【解决方案5】:

    在您的情况下可能是语法错误, 您可以将行更改为:

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

    它为您提供正确的以下输出:

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

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

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

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

        请注意,split 将源字符串中的 \\ 视为分隔的空字符串。使用filter 可以去掉那些空字符串,所以join 不会加倍已经加倍的反斜杠。不幸的是,如果你有 3 个或更多,它们会减少为双反斜杠,但我认为这不会在 windows 路径表达式中伤害你。

        【讨论】:

          【解决方案8】:

          你可以使用

          os.path.abspath(path_with_backlash)
          

          它返回带有\的路径

          【讨论】:

            【解决方案9】:

            用途:

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

            转义\ 字符。

            【讨论】:

            • 你的最后一个参数应该是,"\\\\"。
            • 我想你的意思是最后一个是 r'\\' 或 '\\\\'
            • 使用原始字符串然后应用该替换有什么意义。
            • 我相信解析 Python 的方式,r'\\' 并没有像你预期的那样工作。
            猜你喜欢
            • 2012-06-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-04-15
            • 1970-01-01
            • 2017-07-25
            • 2011-09-06
            相关资源
            最近更新 更多