python替换Unicode字符
我写了一个程序来读取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)
如何写一个正则表达式来替换它们?
有更好的工具,这个工作比正则表达式,你可以尝试,例如:
>>> 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有一个很好的答案。请注意,这是一个不精确的科学,许多关键信息实际上在该答案下的评论主题中。
这个怎么样?
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'表示ASCII范围之外的字节。 Python字符串(含糊不清的术语)的'__repr__'会捕获这些字节并打印出十六进制值的表示形式。 –
不,这不起作用,因为\ xc2不被视为一个正常的字符串,这整个'字符串'不能被视为个人字符的组合。 – kenneth171
不,这不起作用,因为\ xc2不被视为一个正常的字符串,整个'字符串'不能被视为个体字符的组合。我发现我可以在regex中使用以下值:re.sub(r'[\ x03] | [\ x8d] | [\ xa0- \ xaf] | [\ xb0- \ xbf] | [\ xc0- \ xcf] | [\ xd0- \ xdf]','',行)。但缺点是我需要事先知道可能的范围才能拿出这个范围。 – kenneth171
纯粹作为读者的exersize - 're.sub('[\ x80- \ xff]','?',line)'。但请不要那么做,@ wim的答案就是你应该去做的。 –