python 替换unicode字符

python replace unicode characters

我写了一个程序来读取 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)

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

有比正则表达式更好的工具来完成这项工作,例如您可以尝试:

>>> 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 发生的错误 encoding/decoding,这样您就可以使用正确的代码页恢复数据。

关于未烘烤 emojibake 有一个很好的答案 here。请注意,这是一门不精确的科学,许多关键信息实际上都在该答案下的评论线程中。

这个呢?

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)