python替换unicode字符

python替换unicode字符,python,mojibake,Python,Mojibake,我写了一个程序来读取Windows DNS调试日志,但里面总是在域字段中出现一些有趣的字符 下面是一个例子: (13)\xc2\xb5\xc2\xb1\xc2\xbe\xc3\xa2p\xc3\xb4\xc2\x8d(5)example(3)com(0)' 但如果我这样写,它就不起作用了: re.sub('\\\x..','?',行) 如何编写正则表达式来替换它们?有比正则表达式更好的工具,您可以尝试以下示例: >>> line '(13)\xc2\xb5\xc2\xb1\xc

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

下面是一个例子:

(13)\xc2\xb5\xc2\xb1\xc2\xbe\xc3\xa2p\xc3\xb4\xc2\x8d(5)example(3)com(0)' 但如果我这样写,它就不起作用了:

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


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

有比正则表达式更好的工具,您可以尝试以下示例:

>>> 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)
但最好的解决方案是首先找出是什么错误的编码/解码导致了数据丢失,这样您就可以通过使用正确的代码页来恢复数据

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

这个怎么样

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)

这是完全错误的。字符串不是一系列
\
x
字符,后跟一对字母数字字符,
\xNN
s表示ASCII范围之外的字节。python字符串(不明确的术语)的
\uuuuu repr\uuuu
捕获这些字节并打印其十六进制值的表示。不,这不起作用,因为\xc2不被视为普通字符串,整个“字符串”不能被视为单个字符的组合。不,这不起作用,因为\xc2不被视为普通字符串,整个“字符串”不能被视为单个字符的组合。我发现我可以使用正则表达式中的值范围来实现这一点:re.sub(r'[\x03].[\x8d].[\xa0-\xaf].[\xb0-\xbf].[\xc0-\xcf].[\xd0-\xdf]','',第行)。但缺点是我需要提前知道可能的范围,才能得出这个范围。@kenneth171请查看我对这个问题的评论。Ascii仅使用
\x00-\x7f
,因此您可以使用范围
\x80-\xff
。仅作为读取器的练习大小-
re.sub(“[\x80-\xff]”,“?”,行)
。但请不要这样做,@wim的回答是你应该去做的。
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)