【问题标题】:Convering double backslash to single backslash in Python 3在 Python 3 中将双反斜杠转换为单反斜杠
【发布时间】:2013-01-22 06:56:46
【问题描述】:

我有一个这样的字符串:

>>> t
'\\u0048\\u0065\\u006c\\u006c\\u006f\\u0020\\u20ac\\u0020\\u00b0'

我使用一个函数将 unicode 转换为代表性的 Python 转义序列。然后,当我想将其转换回来时,我无法摆脱双反斜杠,以便再次将其解释为 unicode。如何做到这一点?

>>> t = unicode_encode("
>>> t
'\\u0048\\u0065\\u006c\\u006c\\u006f\\u0020\\u20ac\\u0020\\u00b0'
>>> print(t)
\u0048\u0065\u006c\u006c\u006f\u0020\u20ac\u0020\u00b0    
>>> t.replace('\\','X')
'Xu0048Xu0065Xu006cXu006cXu006fXu0020Xu20acXu0020Xu00b0'
>>> t.replace('\\', '\\')
'\\u0048\\u0065\\u006c\\u006c\\u006f\\u0020\\u20ac\\u0020\\u00b0'

当然,我也做不到:

>>> t.replace('\\', '\')
  File "<ipython-input-155-b46c447d6c3d>", line 1
    t.replace('\\', '\')
                         ^
SyntaxError: EOL while scanning string literal

【问题讨论】:

    标签: python-3.x replace escaping backslash


    【解决方案1】:

    不确定这是否适合您的情况,但您可以尝试使用unicode_escape

    >>> t
    '\\u0048\\u0065\\u006c\\u006c\\u006f\\u0020\\u20ac\\u0020\\u00b0'
    >>> type(t)
    <class 'str'>
    >>> enc_t = t.encode('utf_8')
    >>> enc_t
    b'\\u0048\\u0065\\u006c\\u006c\\u006f\\u0020\\u20ac\\u0020\\u00b0'
    >>> type(enc_t)
    <class 'bytes'>
    >>> dec_t = enc_t.decode('unicode_escape')
    >>> type(dec_t)
    <class 'str'>
    >>> dec_t
    'Hello € °'
    

    或缩写形式:

    >>> t.encode('utf_8').decode('unicode_escape')
    'Hello € °'
    

    您获取字符串并使用UTF-8 对其进行编码,然后使用unicode_escape 对其进行解码。

    【讨论】:

    • 谢谢。我看到了你之前的帖子,我尝试了它并意识到它需要转换为二进制对象,我用 bytes(t, 'utf8').decode('unicode_escape') 做了这个,但我喜欢你在上面做得更好。感谢您为我指明正确的方向。另外,从现在开始,我将只使用 str.encode('unicode_escape') 来给我一个二进制文件。非常感谢。
    • @narnie Ha,完全是我的错 - 我是根据 Python 2.x 完成的,然后意识到我可能应该更仔细地阅读 :) 祝一切顺利!
    • 不,你帮了我大忙。我很感激。再次感谢。
    【解决方案2】:

    您的代码中只有一个反斜杠,但反斜杠表示为\\。如您所见,当您使用print() 时,只有一个反斜杠。所以如果你想摆脱两个反斜杠之一,不要做任何事情,它不存在。如果你想摆脱两者,只需删除一个。再次使用\\ 表示一个反斜杠:t.replace("\\", "")

    所以你的字符串一开始就没有两个反斜杠,这不应该是问题。

    【讨论】:

    • 试过了,不行。我们在这里处理的是t='Hello \u20AC' 被解释为\u20AC 是一个字符并转换为欧元的事实。是特殊处理。这就是问题所在。解决方案由@RocketDonkey 提供。
    【解决方案3】:

    由于反斜杠是转义字符,并且您正在搜索两个反斜杠,因此您需要将 四个 反斜杠替换为 两个 - 即:

    t.replace("\\\\", "\\")
    

    这会将每个r"\\" 替换为r"\"r 表示原始字符串。因此,例如,如果您在 idle 或任何 python 脚本(或 Python 2 中的 print r"\\")中输入 print(r"\\"),您将得到 \\\\。这意味着每个"\\" 实际上只是一个r"\"

    user1632861 建议您使用.replace("\\", ""),但这将永远替换r"\"。请尝试 above 方法。 :D

    但是,在这种情况下,您似乎正在读取/接收数据,并且您可能希望使用正确的编码然后解码为 un​​icode(正如我上面的人所建议的那样)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-29
      • 2013-04-15
      • 2013-06-24
      • 2017-07-25
      • 2020-02-01
      • 2010-09-11
      • 1970-01-01
      • 2012-06-16
      相关资源
      最近更新 更多