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

Klu*_*dge 9 python utf-8 character-encoding string-parsing python-2.7

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

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

'\xe2\x80\x9chttp://www.google.com\xe2\x80\x9d blah blah#%#@$^blah'
Run Code Online (Sandbox Code Playgroud)

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

'http://www.google.com blah blah#%#@$^blah'
Run Code Online (Sandbox Code Playgroud)

解码没有帮助:

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

我怎样才能做到这一点?

Mag*_*eno 21

只需删除所有非ASCII字符:

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

其他可能的方案:

>>> 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'
Run Code Online (Sandbox Code Playgroud)

或使用正则表达式:

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

选择你最喜欢的一个.

  • 我选了第一个:) (2认同)

bru*_*ers 6

这些不是"十六进制字符",而是内部表示(第一种情况下为utf-8编码,第二种情况下为unicode代码点)的unicode字符"LEFT 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
Run Code Online (Sandbox Code Playgroud)

至于如何删除它们,它们只是普通的字符,所以简单的str.replace()做法:

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

如果你想一次性删除所有非ascii字符,你只需要解码为unicode然后使用"ignore"参数编码为ascii:

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

  • @pyd:这个问题被标记为 python 2.7 并且 `str` 在 python 2.7 中有一个 `decode` 方法 - 这在 python 3 中消失了(显然因为 py3 字符串是 unicode 所以 `decode` 方法没有意义 - 但它仍然存在于 py3 字节字符串(类型 `byte`)。 (2认同)