2016-09-28 212 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