同様の質問がありますが、私の場合に有効な解決策が見つからないようです。
文字列でいくつかの迷惑な16進文字に遭遇しました。
'\xe2\x80\x9chttp://www.google.com\xe2\x80\x9d blah blah#%#@$^blah'
私が必要なのは、これらの16進数を削除することです\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'
好きなものを選んでください。
これらは「16進文字」ではなく、Unicode文字「LEFT DOUBLE QUOTATION MARK」(「」」および「RIGHT DOUBLE QUOTATION MARK」の内部表現(最初のケースではutf-8エンコードされ、2番目のケースではUnicodeコードポイント)です。 '(' "')。
_>>> 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'
_
あなたはそれが有効な文字をチェックするようにさせることができ、すべてをタイプアウトする代わりに、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)
このようにエンコードした後にデコードを使用できます
s.encode('ascii', errors='ignore').decode("utf-8")