python替换unicode字符

时间:2016-09-28 15:25:25

标签: python mojibake

我写了一个程序来读取Windows DNS调试日志,但内部总是在域字段中有一些有趣的字符。

以下是其中一个例子:

(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)

如何编写正则表达式来替换它们?

2 个答案:

答案 0 :(得分: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首先发生的错误,因此您可以使用正确的代码页恢复数据。

关于unbaking emojibake here有一个很好的答案。请注意,这是一个不精确的科学,很多关键信息实际上都在该答案下的评论主题中。

答案 1 :(得分:-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)