Python(わかりません))の非常に基本的な文字列の問題で問題が発生しています。基本的に、私は次のことを試みています:
'# read file into a string
myString = file.read()
'# Attempt to remove non breaking spaces
myString = myString.replace("\u00A0"," ")
'# however, when I print my string to output to console, I get:
Foo **<C2><A0>** Bar
「\ u00A0」はUnicodeの非改行スペースのエスケープコードであると思いましたが、どうやら私はこれを適切に行っていません。私が間違っていることについてのアイデアはありますか?
あなたはユニコード文字列を持っていませんが、UTF-8バイトのリスト(これは文字列がPython 2.xにあるものです)です。
試す
myString = myString.replace("\xc2\xa0", " ")
ユニコードに切り替えることをお勧めします-アイデアについては この記事 を参照してください。したがって、あなたは言うことができます
uniString = unicode(myString, "UTF-8")
uniString = uniString.replace(u"\u00A0", " ")
また、動作するはずです(注意:Python 2.xは現在利用できません)。ただし、ファイルに送信するときにバイト(バイナリ)に変換する必要があります。または画面に印刷します。
番号、 u"\u00A0"
は、改行しないスペースのエスケープコードです。 "\u00A0"
は、エスケープコードではない6文字です。 これを読む 。
古い質問に別の答えを追加する前に私はためらいますが、Python3はUnicodeの「改行しないスペース」文字を空白文字として数えるため、文字列はデフォルトでUnicodeであるため、文字列内の改行しないスペースを取り除くことができますs
は、次のようにjoin
とsplit
を使用します。
s = ' '.join(s.split())
もちろん、これにより他の空白(タブ、改行など)も変更されます。また、これはPython3のみであることに注意してください。
単純なmyString.strip()
は、スペースだけでなく、myStringの最初と最後から非改行スペースも削除することに注意してください。 OPが要求したとおりではありませんが、多くの場合、非常に便利です。
この問題は、エンコーディングを適用することで簡単に解決できます。
cleaned_string = myString.encode('ascii', 'ignore')
あなたが書いていることには、必ずしも何か間違っていることを示すものはありません。元の文字列に「Foo」と「Bar」の間に改行しないスペースがあった場合、代わりに通常のスペースができます。これは、ある時点で入力文字列をデコードしたと想定しています(Python 3またはfile
が、 codecs
モジュール)をUnicode文字列に変換します。そうしないと、replace
の目的で、Unicode以外のバイト文字列にUnicode文字を配置する可能性は低くなります。ただし、あなたが書いたものに問題の明確な兆候はありません。
入力とは何ですか(print repr(myString)
、置換の直前)、出力とは何ですか(print repr(myString)
、もう一度after置換)、そしてあなたが考える理由それは問題だ? repr
がないと、実際に異なる文字列はlookと同じになる可能性がありますが、repr
が役立ちます。