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

Remove all hex characters from string in 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'

我怎样才能做到这一点?

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

选一个你最喜欢的。

您可以让它检查有效字母,而不是输入所有内容,可以使用 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)

这些不是 "hex characters" 而是 unicode 字符 'LEFT DOUBLE QUOTATION MARK' ('“') 和'RIGHT DOUBLE QUOTATION MARK' ('”')。

>>> 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 字符,你只需解码为 un​​icode,然后使用 "ignore" 参数编码为 ascii:

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

你可以像这样编码后使用解码

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