文字列からすべての空白を取り除く方法


179

Python文字列のすべてのスペースを削除するにはどうすればよいですか?たとえば、文字列strip my spacesをに変換したいのですが、次のstripmyspacesようにしてそれを実現できないようですstrip()

>>> 'strip my spaces'.strip()
'strip my spaces'

13
str.stripは、先頭と末尾の空白のみに影響することに注意してください。

回答:


311

sepパラメータなしでstr.splitの動作を利用する:

>>> s = " \t foo \n bar "
>>> "".join(s.split())
'foobar'

すべての空白ではなくスペースを削除したい場合:

>>> s.replace(" ", "")
'\tfoo\nbar'

時期尚早の最適化

効率は主要な目標ではありませんが、明確なコードを書くことが重要ですが、最初のタイミングは次のとおりです。

$ python -m timeit '"".join(" \t foo \n bar ".split())'
1000000 loops, best of 3: 1.38 usec per loop
$ python -m timeit -s 'import re' 're.sub(r"\s+", "", " \t foo \n bar ")'
100000 loops, best of 3: 15.6 usec per loop

正規表現はキャッシュされるため、想像するほど遅くはありません。事前にコンパイルしておくと役立ちますが、実際にこれを度も呼び出す場合にのみ問題になります。

$ python -m timeit -s 'import re; e = re.compile(r"\s+")' 'e.sub("", " \t foo \n bar ")'
100000 loops, best of 3: 7.76 usec per loop

re.subは11.3倍遅くなりますが、ボトルネックは確実に他の場所にあることに注意してください。ほとんどのプログラムは、これらの3つの選択肢の違いを認識しません。


おそらく\s+置換よりも遅いでしょう。私は再に固執します。
OTZ 09/10/18

@OTZ:びっくりするかもしれませんが、「覚えて」のメモをご覧ください。

@ロジャーうーん。面白い。s.translateたまたまこの方法を試しましたか?それはおそらく、このページに示されているすべての方法に勝るものです。
OTZ 09/10/18

@Roger Pate:翻訳に「テーブル」引数は必要ありませんが、それは可能ですNone-驚くべきことに、それにより遅くなります...
martineau

1
お試しくださいmyString.translate(None, " \t\r\n\v")。Rogerの最速(分割して結合)技術である限り、83%しかかかりません。splitが行うすべての空白文字をカバーするかどうかは不明ですが、ほとんどのASCIIアプリケーションではおそらくそれで十分です。
brianmearns 2012年

60
>>> import re
>>> re.sub(r'\s+', '', 'strip my spaces')
'stripmyspaces'

また、あなたが考えていない空白文字も処理します(信じてください、たくさんあります)。


3
これは、受け入れられた回答よりもソリューションのハックがはるかに少ないものです。
ジョンスミス

これは他の回答よりも明確であるため、簡単に理解できます。
トリスタン

34

または、

"strip my spaces".translate( None, string.whitespace )

そしてここにPython3バージョンがあります:

"strip my spaces".translate(str.maketrans('', '', string.whitespace))

これは最もpythonicのようです。なぜそれがトップに賛成されていないのですか?
rbp

答えのPython 3コードは機能します。@DanMenesからのコメントは廃止されました
igo

3
NameError: name 'string' is not defined
Zelphir Kaltstahl 2018

@ZelphirKaltstahlする必要がありますimport string
Shahryar Saljoughi

13

最も簡単なのは、replaceを使用することです。

"foo bar\t".replace(" ", "").replace("\t", "")

または、正規表現を使用します。

import re
re.sub(r"\s", "", "foo bar\t")

10

Pythonの開始スペースを削除する

string1="    This is Test String to strip leading space"
print string1
print string1.lstrip()

Pythonで末尾または末尾のスペースを削除する

string2="This is Test String to strip trailing space     "
print string2
print string2.rstrip()

Pythonの文字列の先頭と末尾から空白を削除する

string3="    This is Test String to strip leading and trailing space      "
print string3
print string3.strip()

Pythonのすべてのスペースを削除します

string4="   This is Test String to test all the spaces        "
print string4
print string4.replace(" ", "")

3

で正規表現を試してくださいre.sub。すべての空白を検索し、空の文字列に置き換えることができます。

\sパターン内では空白(タブ、改行など)だけでなく空白文字にも一致します。詳しくはマニュアルをご覧ください。


私は正規表現の使い方を
知りません

@wrongusername:reモジュールのマニュアルページへのリンクで更新。
マシューアイセリン

2
import re
re.sub(' ','','strip my spaces')

3
SOへようこそ。回答ありがとうございますが、他の回答に加えて付加価値を提供する方がよいでしょう。この場合、別のユーザーがすでにそのソリューションを投稿しているため、あなたの答えは追加の価値を提供しません。以前の回答が参考になった場合は、十分な評判を得たら、投票してください
Maximilian Peters

これは、「すべての空白を削除する方法」という質問には答えません。スペースのみが削除されます
Nick

2

ロジャー・ペイトが述べたように、次のコードは私のために働きました:

s = " \t foo \n bar "
"".join(s.split())
'foobar'

Jupyter Notebookを使用して次のコードを実行しています:

i=0
ProductList=[]
while i < len(new_list): 
   temp=''                            # new_list[i]=temp=' Plain   Utthapam  '
   #temp=new_list[i].strip()          #if we want o/p as: 'Plain Utthapam'
   temp="".join(new_list[i].split())  #o/p: 'PlainUtthapam' 
   temp=temp.upper()                  #o/p:'PLAINUTTHAPAM' 
   ProductList.append(temp)
   i=i+2

2

split/joinまたはリストほど効率的ではありませんが、リストをフィルタリングする標準的な手法が適用されますtranslateメソッドます。

空白のセットが必要です:

>>> import string
>>> ws = set(string.whitespace)

filter組み込み:

>>> "".join(filter(lambda c: c not in ws, "strip my spaces"))
'stripmyspaces'

リスト内包(はい、括弧を使用します:下記のベンチマークを参照してください):

>>> import string
>>> "".join([c for c in "strip my spaces" if c not in ws])
'stripmyspaces'

折り目:

>>> import functools
>>> "".join(functools.reduce(lambda acc, c: acc if c in ws else acc+c, "strip my spaces"))
'stripmyspaces'

基準:

>>> from timeit import timeit
>>> timeit('"".join("strip my spaces".split())')
0.17734256500003198
>>> timeit('"strip my spaces".translate(ws_dict)', 'import string; ws_dict = {ord(ws):None for ws in string.whitespace}')
0.457635745999994
>>> timeit('re.sub(r"\s+", "", "strip my spaces")', 'import re')
1.017787621000025

>>> SETUP = 'import string, operator, functools, itertools; ws = set(string.whitespace)'
>>> timeit('"".join([c for c in "strip my spaces" if c not in ws])', SETUP)
0.6484303600000203
>>> timeit('"".join(c for c in "strip my spaces" if c not in ws)', SETUP)
0.950212219999969
>>> timeit('"".join(filter(lambda c: c not in ws, "strip my spaces"))', SETUP)
1.3164566040000523
>>> timeit('"".join(functools.reduce(lambda acc, c: acc if c in ws else acc+c, "strip my spaces"))', SETUP)
1.6947649049999995

0

TL / DR

このソリューションはPython 3.6を使用してテストされました

Python3で文字列からすべてのスペースを取り除くには、次の関数を使用できます。

def remove_spaces(in_string: str):
    return in_string.translate(str.maketrans({' ': ''})

空白文字( '\ t \ n \ r \ x0b \ x0c')を削除するには、次の関数を使用できます。

import string
def remove_whitespace(in_string: str):
    return in_string.translate(str.maketrans(dict.fromkeys(string.whitespace)))

説明

Pythonのstr.translateメソッドはstrの組み込みクラスメソッドであり、テーブルを受け取り、渡された変換テーブルを通じて各文字がマップされた文字列のコピーを返します。str.translateの完全なドキュメント

変換テーブルを作成するためにstr.maketrans使用されます。このメソッドは、のもう1つの組み込みクラスメソッドですstr。ここでは、1つのパラメーター(この場合はディクショナリー)だけで使用します。キーは、置換される文字であり、文字置換値で値にマップされます。で使用する変換テーブルを返しますstr.translatestr.maketransの完全なドキュメント

stringPython のモジュールには、いくつかの一般的な文字列操作と定数が含まれています。string.whitespace空白と見なされるすべてのASCII文字を含む文字列を返す定数です。これには、スペース、タブ、ラインフィード、リターン、フォームフィード、および垂直タブの文字が含まれます。文字列の完全なドキュメント

2番目の関数でdict.fromkeysは、キーがstring.whitespaceそれぞれvalueとともに返される文字列内の文字である辞書を作成するために使用されますNonedict.fromkeysの完全なドキュメント


0

最適なパフォーマンスが要件ではなく、単純なものが必要な場合は、文字列クラスの組み込みの「isspace」メソッドを使用して各文字をテストする基本関数を定義できます。

def remove_space(input_string):
    no_white_space = ''
    for c in input_string:
        if not c.isspace():
            no_white_space += c
    return no_white_space

構築no_white_space文字列は、このよう理想的な性能を持っていますが、解決策は、理解しやすいことはありません。

>>> remove_space('strip my spaces')
'stripmyspaces'

関数を定義したくない場合は、これをリスト内包で漠然と類似したものに変換できます。トップアンサーのjoinソリューションから借用する:

>>> "".join([c for c in "strip my spaces" if not c.isspace()])
'stripmyspaces'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.