从 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_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)
这些不是 "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 字符,你只需解码为 unicode,然后使用 "ignore" 参数编码为 ascii:
>>> s.decode("utf-8").encode("ascii", "ignore")
'http://www.google.com blah blah#%#@$^blah'
你可以像这样编码后使用解码
s.encode('ascii', errors='ignore').decode("utf-8")
虽然也有类似的问题,但我似乎找不到适合我的案例的有效解决方案:
我在字符串中遇到了一些烦人的十六进制字符,例如
'\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_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)
这些不是 "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 字符,你只需解码为 unicode,然后使用 "ignore" 参数编码为 ascii:
>>> s.decode("utf-8").encode("ascii", "ignore")
'http://www.google.com blah blah#%#@$^blah'
你可以像这样编码后使用解码
s.encode('ascii', errors='ignore').decode("utf-8")