从Python 3中的bytestring中提取有效数据

时间:2013-02-07 06:56:45

标签: regex python-3.x python-3.2 bytestring

给定以下字节字符串,如何删除与\ 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,并且更喜欢仅使用标准库。

1 个答案:

答案 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之间的字节值作为其字符代码的一部分。

当然,您可以随时根据此答案中给出的示例手动微调您要删除的确切范围。