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

18

虽然有类似的问题,但我似乎找不到适用于我的情况的有效解决方法:

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

'\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'

我该如何实现这个目标?

4个回答

38

只需删除所有非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'

选择你喜欢的那一个。


3
我选择第一个 :) - Kludge

9

这些并不是“十六进制字符”,而是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字符,只需使用“ignore”参数解码为Unicode,然后编码为ASCII即可:
>>> s.decode("utf-8").encode("ascii", "ignore")
'http://www.google.com blah blah#%#@$^blah'

1
属性错误:'str'对象没有'decode'属性。 - Pyd
2
@pyd:这个问题被标记为Python 2.7,并且在Python 2.7中,str确实有一个decode方法 - 在Python 3中消失了(显然因为Py3字符串是Unicode,所以decode方法没有意义 - 但它仍然存在于Py3字节字符串(类型为byte)中。 - bruno desthuilliers

4
你可以让它检查有效字母,并且不需要一个个键入,可以使用 string 模块。可能对你有用的是 string.ascii_letters (包括 string.ascii_lowercasestring.ascii_uppercase)、string.digitsstring.printablestring.punctuation
我建议先尝试使用 string.printable,但如果它通过了太多的字符,则可以混合使用其他模块。
以下是我做的一个例子:
import string
valid_characters = string.printable
start_string = '\xe2\x80\x9chttp://www.google.com\xe2\x80\x9d blah blah#%#@$^blah'
end_string = ''.join(i for i in start_string if i in valid_characters)

2
您可以像这样在编码后使用解码:

您可以在编码后使用解码,就像这样

s.encode('ascii', errors='ignore').decode("utf-8")

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