虽然有类似的问题,但我似乎无法为我的案例找到合适的解决方案:
我在字符串中遇到一些恼人的十六进制字符,例如
'\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'
我怎样才能做到这一点?
答案 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_lowercase
和string.ascii_uppercase
),string.digits
,string.printable
和string.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")