web-dev-qa-db-ja.com

Pythonを使用して文字列から改行しないスペースを削除する

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の非改行スペースのエスケープコードであると思いましたが、どうやら私はこれを適切に行っていません。私が間違っていることについてのアイデアはありますか?

26

あなたはユニコード文字列を持っていませんが、UTF-8バイトのリスト(これは文字列がPython 2.xにあるものです)です。

試す

myString = myString.replace("\xc2\xa0", " ")

ユニコードに切り替えることをお勧めします-アイデアについては この記事 を参照してください。したがって、あなたは言うことができます

uniString = unicode(myString, "UTF-8")
uniString = uniString.replace(u"\u00A0", " ")

また、動作するはずです(注意:Python 2.xは現在利用できません)。ただし、ファイルに送信するときにバイト(バイナリ)に変換する必要があります。または画面に印刷します。

40
Kathy Van Stone

番号、 u"\u00A0"は、改行しないスペースのエスケープコードです。 "\u00A0"は、エスケープコードではない6文字です。 これを読む

古い質問に別の答えを追加する前に私はためらいますが、Python3はUnicodeの「改行しないスペース」文字を空白文字として数えるため、文字列はデフォルトでUnicodeであるため、文字列内の改行しないスペースを取り除くことができますsは、次のようにjoinsplitを使用します。

s = ' '.join(s.split())

もちろん、これにより他の空白(タブ、改行など)も変更されます。また、これはPython3のみであることに注意してください。

3
Thruston

単純なmyString.strip()は、スペースだけでなく、myStringの最初と最後から非改行スペースも削除することに注意してください。 OPが要求したとおりではありませんが、多くの場合、非常に便利です。

1
Jpsy

この問題は、エンコーディングを適用することで簡単に解決できます。

 cleaned_string = myString.encode('ascii', 'ignore')
0
Amirhos Imani

あなたが書いていることには、必ずしも何か間違っていることを示すものはありません。元の文字列に「Foo」と「Bar」の間に改行しないスペースがあった場合、代わりに通常のスペースができます。これは、ある時点で入力文字列をデコードしたと想定しています(Python 3またはfileが、 codecsモジュール)をUnicode文字列に変換します。そうしないと、replaceの目的で、Unicode以外のバイト文字列にUnicode文字を配置する可能性は低くなります。ただし、あなたが書いたものに問題の明確な兆候はありません。

入力とは何ですか(print repr(myString)、置換の直前)、出力とは何ですか(print repr(myString)、もう一度after置換)、そしてあなたが考える理由それは問題だ? reprがないと、実際に異なる文字列はlookと同じになる可能性がありますが、reprが役立ちます。

0
Alex Martelli