给定以下字节字符串,如何删除与\ xFF匹配的任何字符,并从左边的内容创建一个列表对象(通过拆除删除的区域)?
b"\x07\x00\x00\x00~\x10\x00pts/5\x00\x00/5\x00\x00user\x00\x00"
期望的结果:
["~", "pts/5", "/5", "user"]
上面的字符串只是一个例子 - 我想删除任何\ x ..(未解码的)字节。
我正在使用Python 3.2.3,并且更喜欢仅使用标准库。
答案 0 :(得分:1)
>>> a = b"\x07\x00\x00\x00~\x10\x00pts/5\x00\x00/5\x00\x00user\x00\x00"
>>> import re
>>> re.findall(rb"[^\x00-\x1f\x7f-\xff]+", a)
[b'~', b'pts/5', b'/5', b'user']
结果仍为bytes
个对象。如果您希望结果为字符串:
>>> [i.decode("ascii") for i in re.findall(rb"[^\x00-\x1f\x7f-\xff]+", a)]
['~', 'pts/5', '/5', 'user']
<强>解释强>
[^\x00-\x1f\x7f-\xff]+
匹配ASCII 0和31之间范围(+
)中不的一个或多个([^...]
)字符(\x00-\x1F
})或ASCII 127和255之间(\x7f-\xff
)。
请注意,只有“嵌入文本”为ASCII时,此方法才有效。它将从ä
等8位代码页中编码的字符串中删除所有扩展字母字符(如é
,€
,latin-1
等),它将有效地销毁以UTF-8
和其他Unicode编码编码的字符串,因为它们包含0到31/127和255之间的字节值作为其字符代码的一部分。
当然,您可以随时根据此答案中给出的示例手动微调您要删除的确切范围。