2013-02-07 15 views
1

考慮下面的字節串的字節字符串拉動有效的數據,我怎麼能去掉匹配\ XFF任何字符,然後創建一個從還剩下些什麼(上移除的區域通過拆分)的列表對象?從在Python 3

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
>>> 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作爲其字符代碼的一部分。

當然,你可以隨時手動微調你要按照這個答案給出的例子中刪除的確切範圍。

+0

我不得不改變re.findall(RB 「模式」,a)到re.findall(B 「模式」,一個),這樣這個在Ubuntu 12.10(Python的3.2.3)工作,但它沒有。 一些字符仍然會通過,如\ x7f和\ x8e。我實際上不確定這個字符串是否是UTF-8,它在Linux中是一個開放的('/ var/run/utmp','rb')。read()。 – 5ba8cabe450348c7fbe2

+0

@wroberts:奇怪的是,Ubuntu上的Python會遇到原始字符串的問題,但是,沒有它,它確實有效(當其他轉義序列在其他情況下會變得模糊不清時,它通常是一個正則表達式的有用習慣,比如'\ b' )。您也可以刪除大於ASCII 127的所有字符。將編輯我的答案。 –