我写了一个程序来读取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)
如何编写正则表达式来替换它们?
答案 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)