Python替换Unicode字符

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

我该如何编写一个正则表达式来替换所有这些字符?


纯粹是为了读者练习 - re.sub('[\x80-\xff]', '?', line)。但请不要这样做,@wim的答案才是你应该选择的。 - Andrew Gelnar
2个回答

3

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

>>> 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字符。或者使用replace,您可以将它们替换为“?”占位符:

>>> print line.decode('ascii', 'replace')
(13)��������p����(5)example(3)com(0)

但最好的解决方案是找出导致 乱码 发生的错误编码/解码,以便您可以使用正确的代码页恢复数据。

关于解决乱码问题,这里 有一个很好的答案。请注意,这是一门不精确的科学,许多关键信息实际上在该答案下的评论线程中。


-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__(模糊术语)捕获这些字节并打印它们的十六进制值的表示。 - Andrew Gelnar
不,这不起作用是因为\xc2不被视为普通字符串,整个“字符串”不能被视为单个字符的组合。 - kenneth171
不,这样不行,因为\xc2并没有被视为一个正常的字符串,整个“字符串”不能被看作是由单独字符组成的。我发现我可以在正则表达式中使用一系列值来解决这个问题:re.sub(r'[\x03]|[\x8d]|[\xa0-\xaf]|[\xb0-\xbf]|[\xc0-\xcf]|[\xd0-\xdf]', '', line)。但缺点是我需要预先知道可能的范围才能得出这个范围。 - kenneth171
@kenneth171,请查看我在问题上的评论。Ascii仅使用\x00-\x7f,因此您可以使用范围\x80-\xff - Andrew Gelnar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接