从 Python 中的字符串中删除所有十六进制字符

新手上路,请多包涵

尽管有类似的问题,但我似乎找不到适合我的案例的有效解决方案:

我在字符串中遇到一些烦人的十六进制字符,例如

'\xe2\x80\x9chttp://www.google.com\xe2\x80\x9d blah blah#%#@$^blah'

我需要的是删除这些十六进制 \xHH 字符,并且单独删除它们,以获得以下结果:

 'http://www.google.com blah blah#%#@$^blah'

解码没有帮助:

 s.decode('utf8') # u'\u201chttp://www.google.com\u201d blah blah#%#@$^blah'

我怎样才能做到这一点?

原文由 Kludge 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 908
2 个回答

只需删除所有非 ASCII 字符:

 >>> s.decode('utf8').encode('ascii', errors='ignore')
'http://www.google.com blah blah#%#@$^blah'

其他可能的解决方案:

 >>> import string
>>> s = '\xe2\x80\x9chttp://www.google.com\xe2\x80\x9d blah blah#%#@$^blah'
>>> printable = set(string.printable)
>>> filter(lambda x: x in printable, s)
'http://www.google.com blah blah#%#@$^blah'

或者使用正则表达式:

 >>> import re
>>> re.sub(r'[^\x00-\x7f]',r'', s)
'http://www.google.com blah blah#%#@$^blah'

选择你最喜欢的。

原文由 Magnun Leno 发布,翻译遵循 CC BY-SA 3.0 许可协议

这些不是“十六进制字符”,而是 unicode 字符“左双引号”(““”)和“右双引号”的内部表示(第一种情况下为 utf-8 编码,第二种情况下为 unicode 代码点) ‘(’”’)。

 >>> s = "\xe2\x80\x9chttp://www.google.com\xe2\x80\x9d blah blah#%#@$^blah"
>>> print s
“http://www.google.com” blah blah#%#@$^blah
>>> s.decode("utf-8")
u'\u201chttp://www.google.com\u201d blah blah#%#@$^blah'
>>> print s.decode("utf-8")
“http://www.google.com” blah blah#%#@$^blah

至于如何删除它们,它们只是普通字符,所以一个简单的 str.replace() 就可以了:

 >>> s.replace("\xe2\x80\x9c", "").replace("\xe2\x80\x9d", "")
'http://www.google.com blah blah#%#@$^blah'

如果你想一次摆脱所有非 ascii 字符,你只需要解码为 unicode,然后使用“ignore”参数编码为 ascii:

 >>> s.decode("utf-8").encode("ascii", "ignore")
'http://www.google.com blah blah#%#@$^blah'

原文由 bruno desthuilliers 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题