如何从字节对象中删除双反斜杠 (`\\`)?

11

例如:

t = str.encode(msg)

print(t)

我遇到了双斜杠的问题,像这样:

b'\\xda\\xad\\x94\\xb4\\x0bg\\x92]R\\x9a1y\\x9d\\xed\\x04\\xd5\\x8e+\\x07\\xf8\\x03\\x1bm\\xd6\\x96\\x10\\xca80\\xe26\\x8a

但是,我希望能够得到以下结果:
b'\xda\xad\x94\xb4\x0bg\x92]R\x9a1y\x9d\xed\x04\xd5\x8e+\x07\xf8\x03\x1bm\xd6\x96\x10\xca80\xe26\x8a'

希望能得到您的帮助。

4个回答

18

利用Python文本编码

有些文本编码可以帮助您轻松地获得所需的结果。
以下是我进行编码和解码以获得所需结果的示例:

# I have the string shortened for presentation
your_string = "\\xda\\xad\\x94"

your_string.encode().decode('unicode_escape').encode("raw_unicode_escape")

以上的操作可以用三个简单步骤来解释:

  1. 对字符串进行编码以将其转换为 bytes 对象,并稍后删除反斜杠转义序列。
  2. 使用 unicode_escape 编解码器将对象解码为字符串,以取消反斜杠的转义。
  3. 使用 raw_unicode_escape 编码器重新编码对象,将其转换回不带有额外转义的字节对象。

多个反斜杠转义序列

也许你有一个包含多个反斜杠转义序列(或双倍反斜杠)的字符串。如果是这样,你可以像上面列出的那样重复执行第2和第3步,直到达到所需次数。

your_string = "\\\\xda\\\\xad\\\\x94"
your_string.encode().decode('unicode_escape').encode('raw_unicode_escape').decode('unicode_escape').encode('raw_unicode_escape')

这可能会变得相当繁琐和混乱,但您可以始终创建一个函数来解决这个问题。

不使用反斜杠转义序列

现在,如果您有一个没有任何反斜杠转义序列的字符串想要转换为字节对象,只需要执行步骤1中所见的编码即可:

your_string = "\xda\xad\x94"
your_string.encode()

字节对象

如果你有一个字节对象而不是一个字符串,基本上一切都是相同的,只需跳过步骤1,因为字节对象已经有一个编码(否则会引发错误)。

your_bytes_obj = b"\\xda\\xad\\x94"
your_string.decode('unicode_escape').encode("raw_unicode_escape")

这些示例都应该给你一个不带转义反斜杠的字节对象,而在我提供的示例中是:

b'\xda\xad\x94'

解释

unicode_escape编解码器在解码时(或者编码时加上转义字符)会去除转义字符,而raw_unicode_escape编解码器在编码时不会对反斜杠进行转义。因此这两个编解码器在处理字节对象中的转义字符时很有用。

raw_unicode_escape

使用Latin-1编码方式,对于其他代码点使用\uXXXX和\UXXXXXXXX表示。现有的反斜杠不做任何转义。它在Python pickle协议中使用。

unicode_escape

将编码适合作为ASCII编码的Python源代码中的Unicode文本的内容,但不会对引号进行转义。从Latin-1源代码解码。请注意,实际上Python源代码默认使用UTF-8。

我要补充说明一下,str.encode()方法并不是编码字符串的唯一方式。你还可以使用codecs模块的encode函数,或者内置的bytes函数(只需提供编码参数即可)。
我之所以在这里使用str.encode方法是因为它看起来更直观易懂。

了解更多信息:
Python 2 标准库 - Python 特定编码
Python 3 标准库 - 文本编码
Python 3 词法分析 - 字符串与字节字符串的文本和转义序列


4

在 Python 3.6 中,您可以使用:

data_bytes, _ = codecs.escape_decode(data, 'hex')` part of `import codecs

库。在您的情况下,datamsg 变量。

如果打印 data_bytes 的值,您将得到以字节为单位的值。


0
你不能这样做,因为 '\\' 表示的是一个斜杠而不是双斜杠。例如,如果你将 msg 转换为字符串并使用 print 函数打印 msg,你只会看到一个斜杠。

-4
我本来想把这个作为对Adrian Gherasims答案的评论,但是它太长了,所以我把它作为一个单独的“答案”。

对于普通符号,您可以使用replace函数。

In [1]: temp = 'aa1aa2aa3aa4aa5'
In [2]: temp
Out[2]: 'aa1aa2aa3aa4aa5'
In [3]: temp.replace('aa', 'a')
Out[3]: 'a1a2a3a4a5'

然而,如果您尝试使用双斜杠执行相同的操作,则会出现语法错误。

In [4]: temp2 = '\\1\\2\\3\\4'
In [5]: temp2
Out[5]: '\\1\\2\\3\\4'
In [6]: temp2.replace('\\', '\')

File "<ipython-input-6-3973ee057a3e>", line 1
temp2.replace('\\', '\')
                       ^
SyntaxError: EOL while scanning string literal

以如何克服语法错误来结束这个答案会更有用。 - Gabriel Staples

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