2016-09-28 341 views
4

我寫了一個程序來讀取Windows DNS調試日誌,但裏面總是有一些有趣的字符域字段。python替換Unicode字符

下面是例子之一:

(13)\xc2\xb5\xc2\xb1\xc2\xbe\xc3\xa2p\xc3\xb4\xc2\x8d(5)example(3)com(0)'

我要全部更換爲\x..?

我明確地鍵入\ XC2如下作品

line = '(13)\xc2\xb5\xc2\xb1\xc2\xbe\xc3\xa2p\xc3\xb4\xc2\x8d(5)example(3)com(0)' 
re.sub('\\\xc2', '?', line) 
result: '(13)?\xb5?\xb1?\xbe\xc3\xa2p\xc3\xb4?\x8d(5)example(3)com(0)' 

但它不是如果我寫作如下:

re.sub('\\\x..', '?', line)

如何寫一個正則表達式來替換它們?

+0

純粹作爲讀者的exersize - 're.sub('[\ x80- \ xff]','?',line)'。但請不要那麼做,@ wim的答案就是你應該去做的。 –

回答

2

有更好的工具,這個工作比正則表達式,你可以嘗試,例如:

>>> line 
'(13)\xc2\xb5\xc2\xb1\xc2\xbe\xc3\xa2p\xc3\xb4\xc2\x8d(5)example(3)com(0)' 
>>> line.decode('ascii', 'ignore') 
u'(13)p(5)example(3)com(0)' 

一個跳過非ASCII字符。或者用替換,你可以將它們換成'?'佔位符:

>>> print line.decode('ascii', 'replace') 
(13)��������p����(5)example(3)com(0) 

但最好的辦法是找出錯誤的編碼/解碼造成mojibake在首位發生,所以您可以通過使用正確的代碼頁中恢復數據。

關於取消烘烤emojibake here有一個很好的答案。請注意,這是一個不精確的科學,許多關鍵信息實際上在該答案下的評論主題中。

-2

這個怎麼樣?

line = '(13)\xc2\xb5\xc2\xb1\xc2\xbe\xc3\xa2p\xc3\xb4\xc2\x8d(5)example(3)com(0)' 

pattern = r'\\x.+' 
re.sub(pattern, r'?', line) 
+1

這完全不正確。該字符串不是一系列後綴爲一對字母數字字符的'\'和'x'字符,'\ xNN'表示ASCII範圍之外的字節。 Python字符串(含糊不清的術語)的'__repr__'會捕獲這些字節並打印出十六進制值的表示形式。 –

+0

不,這不起作用,因爲\ xc2不被視爲一個正常的字符串,這整個'字符串'不能被視爲個人字符的組合。 – kenneth171

+0

不,這不起作用,因爲\ xc2不被視爲一個正常的字符串,整個'字符串'不能被視爲個體字符的組合。我發現我可以在regex中使用以下值:re.sub(r'[\ x03] | [\ x8d] | [\ xa0- \ xaf] | [\ xb0- \ xbf] | [\ xc0- \ xcf] | [\ xd0- \ xdf]','',行)。但缺點是我需要事先知道可能的範圍才能拿出這個範圍。 – kenneth171