文字列内のすべての空白を削除します


788

文字列、両端、単語間のすべての空白を削除したいのですが。

私はこのPythonコードを持っています:

def my_handle(self):
    sentence = ' hello  apple  '
    sentence.strip()

しかし、それは文字列の両側の空白を削除するだけです。すべての空白を削除するにはどうすればよいですか?


4
結果はどのようになりますか?hello applehelloapple
Mark Byers、

4
@JoachimPileborg、正確には私はそうは思いません、なぜならそれは単語間の空白を減らすことにも関係しているからです。
wal-o-mat

3
helloappleは私の出力である必要があります
co2f2e 2013

8
間違っていれば訂正してください。ただし、「空白」は「空白文字」と同義ではありません。正しいとマークされた現在の回答は、すべての空白を削除するわけではありません。しかし、それは正しいとマークされているので、意図した質問に答えたに違いありませんか?それで、受け入れられた回答を反映するように質問を編集する必要がありますか?@Kalanamithすべてまたは空白のみを削除しますか?
AnnanFay 16

回答:


1659

先頭と末尾のスペースを削除する場合は、次を使用しますstr.strip()

sentence = ' hello  apple'
sentence.strip()
>>> 'hello  apple'

すべてのスペース文字を削除する場合は、次を使用しますstr.replace()

(これにより、「通常の」ASCIIスペース文字のみが削除され、他の空白は削除され' ' U+0020ません)

sentence = ' hello  apple'
sentence.replace(" ", "")
>>> 'helloapple'

重複したスペースを削除したい場合は、次を使用しますstr.split()

sentence = ' hello  apple'
" ".join(sentence.split())
>>> 'hello apple'

42
この関数の優れた点は、Beautiful Soupから受け取ったHTMLファイルから「\ r \ n」も削除することです。
lsheng 2014年

27
私は "" .join(sentence.split())が好きです。これにより、文の任意の場所からすべての空白(スペース、タブ、改行)が削除されます。
ドン

ここで初心者。print(sentence.join(sentence.split()))が「hello hello appleapple」になる理由を誰かが私に説明できますか?ここでコードがどのように処理されるかを理解したいだけです。
Yannis Dran 2016年

2
@YannisDranはstr.join()のドキュメントを確認します。呼び出し時に、sentence.join(str_list)Pythonにstr_listのアイテムsentenceをセパレーターとして結合するように要求します。
セドリックジュリアン

1
"".join(sentence.split())確かに標準的なソリューションであり、単なるスペースではなくすべての空白を効率的に削除ます。マーク・バイアーズ優れた答えは、おそらくこの適用性の低い答えの代わりに受け入れられるべきでした。
セシルカレー

263

スペースのみを削除するにはstr.replace

sentence = sentence.replace(' ', '')

削除するには、すべての空白文字を使用することができます(その上のスペース、タブ、改行など)をsplit、その後join

sentence = ''.join(sentence.split())

または正規表現:

import re
pattern = re.compile(r'\s+')
sentence = re.sub(pattern, '', sentence)

最初と最後から空白のみを削除したい場合は、次のコマンドを使用できますstrip

sentence = sentence.strip()

を使用lstripして、文字列の先頭からのみ空白を削除したり、文字列rstripの末尾から空白を削除したりすることもできます。


注:ステップをコンパイルする必要はありません。コンパイルされたパターンをre.sub(およびフレンド)にキャッシュします。Emilの回答も参照してください。
アンディヘイデン

python3:yourstr.translate(str.maketrans('', '', ' \n\t\r'))
deed02392

104

代わりに、正規表現を使用して、これらの奇妙な空白文字にも一致させます。ここではいくつかの例を示します。

単語間であっても、文字列内のすべてのスペースを削除します。

import re
sentence = re.sub(r"\s+", "", sentence, flags=re.UNICODE)

文字列のBEGINNING内のスペースを削除します。

import re
sentence = re.sub(r"^\s+", "", sentence, flags=re.UNICODE)

文字列の末尾のスペースを削除します。

import re
sentence = re.sub(r"\s+$", "", sentence, flags=re.UNICODE)

文字列のBEGINNINGとENDの両方のスペースを削除します。

import re
sentence = re.sub("^\s+|\s+$", "", sentence, flags=re.UNICODE)

重複するスペースのみを削除します。

import re
sentence = " ".join(re.split("\s+", sentence, flags=re.UNICODE))

(すべての例はPython 2とPython 3の両方で機能します)


「\ u202a1234 \ u202c」では機能しませんでした。同じ出力を提供します:u '\ u202a1234 \ u202c'
Sarang

@Sarang:それらは空白文字(ググってみればわかるでしょう)ではなく、「一般的な句読点」です。私の答えは、空白として分類された文字の削除のみを扱います。
EmilStenström2016

これは私がここで見る唯一の解決策で、いまいましい厄介なユニコードの空白文字を削除します。おかげでfam
CapnShanty

41

空白には、スペース、タブ、CRLFが含まれます。したがって、使用できるエレガントで1行の文字列関数はstr.translate次のとおりです。

Python 3

' hello  apple'..translate(str.maketrans('', '', ' \n\t\r'))

または徹底したい場合:

import string
' hello  apple'..translate(str.maketrans('', '', string.whitespace))

Python 2

' hello  apple'.translate(None, ' \n\t\r')

または徹底したい場合:

import string
' hello  apple'.translate(None, string.whitespace)

2
これは次のようなUnicodeの空白には役立ちません\xc2\xa0
Suzana '29

5
ans.translate( None, string.whitespace )builtins.TypeError: translate() takes exactly one argument (2 given)私だけのために生産します。ドキュメントでは、引数は変換テーブルであると述べています。string.maketrans()を参照してください。ただし、以下のAmnon Harelのコメントを参照してください。
user405

2
' hello apple'.translate(str.maketrans('', '', string.whitespace))注:複数回行う場合は、トランステーブルを格納する変数を作成することをお勧めします。
Shogan Aversa-Druesne 2018

16

先頭と末尾から空白を削除するには、を使用しますstrip

>> "  foo bar   ".strip()
"foo bar"

1
この質問では、末尾だけでなく、すべての空白を削除することを具体的に求めています。気をつけてください。
Shayan Shafiq

9
' hello  \n\tapple'.translate({ord(c):None for c in ' \n\t\r'})

MaKはすでに上記の「変換」方法を指摘しています。そして、このバリエーションはPython 3で動作します(このQ&Aを参照)。


2
ありがとう!または、xxx.translate( { ord(c) :None for c in string.whitespace } )徹底的に。
user405

7

注意してください:

strip rstripとlstripを実行します(先頭と末尾のスペース、タブ、改行、フォームフィードは削除しますが、文字列の途中で削除しません)。

スペースとタブのみを置き換えると、探しているものと一致するように見えても同じではない非表示のCRLFが表示される可能性があります。


3
import re    
sentence = ' hello  apple'
re.sub(' ','',sentence) #helloworld (remove all spaces)
re.sub('  ',' ',sentence) #hello world (remove double spaces)

3
問題は、タブと改行文字を含むすべての空白を削除することでした。このスニペットは通常のスペースのみを削除します。
Maximilian Peters

3

さらに、ストリップにはいくつかのバリエーションがあります。

文字列のBEGINNINGおよびENDのスペースを削除します。

sentence= sentence.strip()

文字列のBEGINNING内のスペースを削除します。

sentence = sentence.lstrip()

文字列の末尾のスペースを削除します。

sentence= sentence.rstrip()

3つの文字列関数strip lstripはすべて、rstrip削除する文字列のパラメータを取得できます。デフォルトはすべて空白です。これは、何か特別なものを扱う場合に役立ちます。たとえば、スペースのみを削除して改行を削除することはできます。

" 1. Step 1\n".strip(" ")

または、文字列リストを読み取るときに余分なコンマを削除することもできます。

"1,2,3,".strip(",")

1

文字列、両端、単語間のすべての空白を削除します。

>>> import re
>>> re.sub("\s+", # one or more repetition of whitespace
    '', # replace with empty string (->remove)
    ''' hello
...    apple
... ''')
'helloapple'

Pythonドキュメント:


reは以前に提案されたことは知っていますが、質問のタイトルに対する実際の答えは他のすべてのオプションの中で少し隠されていました。
ハンドル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.