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

时间:2016-04-13 12:18:59

标签: python python-2.7 utf-8 character-encoding string-parsing

虽然有类似的问题,但我似乎无法为我的案例找到合适的解决方案:

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

'\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 个答案:

答案 0 :(得分:18)

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

选择你最喜欢的那个。

答案 1 :(得分:5)

这些不是“十六进制字符”,而是内部表示(在第一种情况下编码的utf-8,在第二种情况下为unicode代码点)的unicode字符'LEFT DOUBLE QUOTATION MARK'('“')和'RIGHT'双引号('''')。

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

您可以在编码之后使用解码

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