将Python 3中的双反斜杠转换为单反斜杠

6

我有一个字符串如下:

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

我使用一个将Unicode转换为Python转义序列的函数创建了一个字符串。然后,当我想要将其转换回Unicode时,无法去掉双反斜杠以便再次解释为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
3个回答

9

不确定这是否适用于您的情况,但您可以尝试使用 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 进行解码。

1
谢谢。我看到了你之前的帖子,我尝试了一下,发现需要将其转换为二进制对象,我用bytes(t, 'utf8').decode('unicode_escape')实现了这一点,但我更喜欢你上面的方法。感谢你指引我正确的方向。此外,从现在开始我会使用str.encode('unicode_escape')来获得一个二进制对象。非常感谢。 - narnie
@narnie 哈哈,完全是我的错 - 我用 Python 2.x 的术语进行了编写,然后意识到我应该仔细阅读 :) 祝你好运! - RocketDonkey
不,是你帮了我,让我感到很受用。我很感激。再次感谢。 - narnie

0

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

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

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

user1632861建议您使用.replace("\\", ""),但这会将每个r"\"替换为无。请改用上面的方法。:D

然而,在这种情况下,似乎你正在读取/接收数据,可能需要使用正确的编码,然后解码为unicode(正如上面的人所建议的那样)。


-1
你的代码中只有一个反斜杠,但是反斜杠在表示时需要用两个反斜杠\\。正如你所看到的,当你使用print()时,只有一个反斜杠。所以如果你想去掉其中一个反斜杠,不需要做任何操作,因为它本来就不存在。如果你想去掉两个反斜杠,只需删除一个即可。再次提醒,使用\\来表示一个反斜杠:t.replace("\\", "")

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


尝试过了,不起作用。我们所面对的问题是t='Hello \u20AC'被解释为\u20AC是一个字符并转换为欧元。这是特殊处理。这就是问题所在。@RocketDonkey提供了解决方案。 - narnie

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