空白を削除するにはどうすればよいですか?


1071

文字列から空白(スペースとタブ)を削除するPython関数はありますか?

例:\t example string\texample string


1
ヘッドアップをありがとう。..私は、以前のストリップ機能を発見したのだが、それは私の入力のために動作していないようです
クリス

1
同じです:stackoverflow.com/questions/761804/trimming-a-string-in-python(この質問は少し明確ですが、私見)。また、これはほぼ同じである:stackoverflow.com/questions/959215/...
Jonik

6
Pythonが空白と見なす文字はに格納されstring.whitespaceます。
John Fouhy、

2
「ストリップ機能」とは、ストリップ方式のことですか?「私の入力では機能していないようです」コード、入力、出力を入力してください。
S.Lott、2009

回答:


1599

両側の空白:

s = "  \t a string example\t  "
s = s.strip()

右側の空白:

s = s.rstrip()

左側の空白:

s = s.lstrip()

以下のようthedzが指摘する、あなたはこのように、これらの機能のいずれかに任意の文字を削除するには、引数を提供することができます。

s = s.strip(' \t\n\r')

これは、任意のスペース、取り除くことができます\t\nまたは\r左側、右側、または文字列の両側から文字を。

上記の例では、文字列の左側と右側からのみ文字列を削除します。文字列の途中から文字も削除したい場合は、以下を試してくださいre.sub

import re
print re.sub('[\s+]', '', s)

それは出力するはずです:

astringexample

18
strip()は、何をトリップするかを伝えるための引数を取ります。試してください:strip( '\ t \ n \ r')
thedz

3
例の結果は非常に役立つはずです:)
ton

4
空白文字をリストする必要はありません:docs.python.org/2/library/string.html#string.whitespace
jesuis

3
最後の例は、を使用した場合とまったく同じstr.replace(" ","")です。re複数のスペースがない限り、を使用する必要はありません。その場合、例は機能しません。[]は単一の文字をマークするように設計されています。だけを使用している場合は不要です\s。使用のいずれか\s+または[\s]+(不要)が、[\s+]仕事をしていない、あなたが回しのような単一のもので複数のスペースを置き換えたい場合は、特に"this example""this example"
ホルヘE.カルドナ

3
@ JorgeE.Cardona-あなたが少し間違っていることの一つ- \sタブは含まれますが含まれreplace(" ", "")ません。
ArtOfWarfare 2017年

72

Python trimメソッドが呼び出されstripます:

str.strip() #trim
str.lstrip() #ltrim
str.rstrip() #rtrim

5
これは、s tri pがtri mとほとんど同じように見えるため、覚えやすいです。
isar 2018

22

先頭と末尾の空白について:

s = '   foo    \t   '
print s.strip() # prints "foo"

それ以外の場合は、正規表現が機能します。

import re
pat = re.compile(r'\s+')
s = '  \t  foo   \t   bar \t  '
print pat.sub('', s) # prints "foobar"

1
正規表現をコンパイルしていません。あなたはそれを作る必要がありますpat = re.compile(r'\s+')
エヴァン・フォスマルク2009

一般的にsub(" ", s)""、後者が単語をマージして、.split(" ")トークン化に使用できなくなります。
user3467349 2015

printステートメントの出力を見るのはいいことです
ロンクライン

19

非常にシンプルで基本的な関数であるstr.replace()を使用して、空白とタブを操作することもできます。

>>> whitespaces = "   abcd ef gh ijkl       "
>>> tabs = "        abcde       fgh        ijkl"

>>> print whitespaces.replace(" ", "")
abcdefghijkl
>>> print tabs.replace(" ", "")
abcdefghijkl

シンプルで簡単。


2
しかし、これは残念ながら内部空間も削除しますが、元の質問の例では内部空間はそのままです。
Brandon Rhodes

12
#how to trim a multi line string or a file

s=""" line one
\tline two\t
line three """

#line1 starts with a space, #2 starts and ends with a tab, #3 ends with a space.

s1=s.splitlines()
print s1
[' line one', '\tline two\t', 'line three ']

print [i.strip() for i in s1]
['line one', 'line two', 'line three']




#more details:

#we could also have used a forloop from the begining:
for line in s.splitlines():
    line=line.strip()
    process(line)

#we could also be reading a file line by line.. e.g. my_file=open(filename), or with open(filename) as myfile:
for line in my_file:
    line=line.strip()
    process(line)

#moot point: note splitlines() removed the newline characters, we can keep them by passing True:
#although split() will then remove them anyway..
s2=s.splitlines(True)
print s2
[' line one\n', '\tline two\t\n', 'line three ']

4

まだ誰もこれらの正規表現ソリューションを投稿していません。

マッチング:

>>> import re
>>> p=re.compile('\\s*(.*\\S)?\\s*')

>>> m=p.match('  \t blah ')
>>> m.group(1)
'blah'

>>> m=p.match('  \tbl ah  \t ')
>>> m.group(1)
'bl ah'

>>> m=p.match('  \t  ')
>>> print m.group(1)
None

検索(「スペースのみ」の入力ケースは別の方法で処理する必要があります):

>>> p1=re.compile('\\S.*\\S')

>>> m=p1.search('  \tblah  \t ')
>>> m.group()
'blah'

>>> m=p1.search('  \tbl ah  \t ')
>>> m.group()
'bl ah'

>>> m=p1.search('  \t  ')
>>> m.group()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'

を使用するとre.sub、内部の空白が削除される可能性があり、望ましくない場合があります。


3

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

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

または徹底したい場合

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

3

(re.sub( '+'、 ''、(my_str.replace( '\ n'、 ''))))。strip()

これにより、不要なスペースと改行文字がすべて削除されます。この助けを願っています

import re
my_str = '   a     b \n c   '
formatted_str = (re.sub(' +', ' ',(my_str.replace('\n',' ')))).strip()

これは結果になります:

'a b \ nc' 'ab c'に変更されます


2
    something = "\t  please_     \t remove_  all_    \n\n\n\nwhitespaces\n\t  "

    something = "".join(something.split())

出力:

please_remove_all_whitespaces


Le Droidのコメントを回答に追加します。スペースで区切るには:

    something = "\t  please     \t remove  all   extra \n\n\n\nwhitespaces\n\t  "
    something = " ".join(something.split())

出力:

余分な空白をすべて削除してください


1
シンプルで効率的。スペースで区切られた単語を維持するために...(「」.joinを使用することができます。
ル・ドロイド

1

Python 3を使用している場合:printステートメントで、sep = ""で終了します。これですべてのスペースが分離されます。

例:

txt="potatoes"
print("I love ",txt,"",sep="")

これは印刷されます: 私はジャガイモが大好きです。

代わりに: 私はジャガイモが大好きです。

あなたの場合、\ tに乗ろうとしているので、sep = "\ t"を実行します


1

ここではさまざまな理解度でかなりの数の解決策を見てきましたが、文字列がカンマで区切られている場合はどうしたらいいのか疑問に思いました...

問題

連絡先情報のcsvを処理しようとしているときに、この問題の解決策が必要でした。余分な空白といくつかのジャンクを削除しますが、末尾のコンマと内部の空白は保持します。連絡先に関するメモを含むフィールドを使用して、私はゴミを取り除き、良いものを残したいと思いました。すべての句読点ともみを取り除いて、後で再構築したくなかったので、複合トークン間の空白を失いたくありませんでした。

正規表現とパターン: [\s_]+?\W+

パターンは、空白文字とアンダースコア( '_')の単一のインスタンスを1から無制限の回数(可能な限り少ない文字数)遅延して検索し、[\s_]+?単語以外の文字が1から無制限の文字の前に来るこの時間:( \W+と同等です[^a-zA-Z0-9_])。具体的には、これは空白のスワスを検出します:null文字(\ 0)、タブ(\ t)、改行(\ n)、フィードフォワード(\ f)、キャリッジリターン(\ r)。

これの利点は2つあります。

  1. それはあなたが一緒に保ちたいかもしれない完全な単語/トークン間の空白を取り除きません;

  2. Pythonの組み込みの文字列メソッドstrip()は、文字列の内部ではなく、左端と右端のみを処理します。デフォルトの引数はnull文字です(以下の例を参照:いくつかの改行がテキストにありstrip()、正規表現パターンがそれらを削除している間はすべて削除されません)。 。text.strip(' \n\t\r')

これはOPの質問を超えていますが、私が行ったように、テキストデータ内に奇妙で異常なインスタンスが存在する場合がたくさんあると思います(一部のテキストでエスケープ文字がどのようになっているか)。さらに、リストのような文字列では、区切り文字が2つの空白文字または '-、'や '-、,,,'などの非単語文字を区切らない限り、区切り文字を削除したくありません。

注:CSV自体の区切り文字については触れていません。データがリストのような、つまり部分文字列のcs文字列であるCSV内のインスタンスのみ。

完全な開示:私はテキストを約1か月だけ操作しており、正規表現は過去2週間だけなので、見逃しているニュアンスがいくつかあると確信しています。とは言っても、文字列の小さなコレクション(私のものは12,000行と40個の奇数列のデータフレームにあります)の場合、余分な文字を削除するためのパスの後の最後のステップとして、これは非常にうまく機能します。単語以外の文字で結合されたテキストを分離したいが、以前は空白がなかった場所に空白を追加したくない。

例:

import re


text = "\"portfolio, derp, hello-world, hello-, -world, founders, mentors, :, ?, %, ,>, , ffib, biff, 1, 12.18.02, 12,  2013, 9874890288, .., ..., ...., , ff, series a, exit, general mailing, fr, , , ,, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, )_(, jim.somedude@blahblah.com, ,dd invites,subscribed,, master, , , ,  dd invites,subscribed, , , , \r, , \0, ff dd \n invites, subscribed, , ,  , , alumni spring 2012 deck: https: www.dropbox.com s, \n i69rpofhfsp9t7c practice 20ignition - 20june \t\n .2134.pdf 2109                                                 \n\n\n\nklkjsdf\""

print(f"Here is the text as formatted:\n{text}\n")
print()
print("Trimming both the whitespaces and the non-word characters that follow them.")
print()
trim_ws_punctn = re.compile(r'[\s_]+?\W+')
clean_text = trim_ws_punctn.sub(' ', text)
print(clean_text)
print()
print("what about 'strip()'?")
print(f"Here is the text, formatted as is:\n{text}\n")
clean_text = text.strip(' \n\t\r')  # strip out whitespace?
print()
print(f"Here is the text, formatted as is:\n{clean_text}\n")

print()
print("Are 'text' and 'clean_text' unchanged?")
print(clean_text == text)

これは出力します:

Here is the text as formatted:

"portfolio, derp, hello-world, hello-, -world, founders, mentors, :, ?, %, ,>, , ffib, biff, 1, 12.18.02, 12,  2013, 9874890288, .., ..., ...., , ff, series a, exit, general mailing, fr, , , ,, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, )_(, jim.somedude@blahblah.com, ,dd invites,subscribed,, master, , , ,  dd invites,subscribed, ,, , , ff dd 
 invites, subscribed, , ,  , , alumni spring 2012 deck: https: www.dropbox.com s, 
 i69rpofhfsp9t7c practice 20ignition - 20june 
 .2134.pdf 2109                                                 



klkjsdf" 

using regex to trim both the whitespaces and the non-word characters that follow them.

"portfolio, derp, hello-world, hello-, world, founders, mentors, ffib, biff, 1, 12.18.02, 12, 2013, 9874890288, ff, series a, exit, general mailing, fr, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk,  jim.somedude@blahblah.com, dd invites,subscribed,, master, dd invites,subscribed, ff dd invites, subscribed, alumni spring 2012 deck: https: www.dropbox.com s, i69rpofhfsp9t7c practice 20ignition 20june 2134.pdf 2109 klkjsdf"

Very nice.
What about 'strip()'?

Here is the text, formatted as is:

"portfolio, derp, hello-world, hello-, -world, founders, mentors, :, ?, %, ,>, , ffib, biff, 1, 12.18.02, 12,  2013, 9874890288, .., ..., ...., , ff, series a, exit, general mailing, fr, , , ,, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, )_(, jim.somedude@blahblah.com, ,dd invites,subscribed,, master, , , ,  dd invites,subscribed, ,, , , ff dd 
 invites, subscribed, , ,  , , alumni spring 2012 deck: https: www.dropbox.com s, 
 i69rpofhfsp9t7c practice 20ignition - 20june 
 .2134.pdf 2109                                                 



klkjsdf"


Here is the text, after stipping with 'strip':


"portfolio, derp, hello-world, hello-, -world, founders, mentors, :, ?, %, ,>, , ffib, biff, 1, 12.18.02, 12,  2013, 9874890288, .., ..., ...., , ff, series a, exit, general mailing, fr, , , ,, co founder, pitch_at_palace, ba, _slkdjfl_bf, sdf_jlk, )_(, jim.somedude@blahblah.com, ,dd invites,subscribed,, master, , , ,  dd invites,subscribed, ,, , , ff dd 
 invites, subscribed, , ,  , , alumni spring 2012 deck: https: www.dropbox.com s, 
 i69rpofhfsp9t7c practice 20ignition - 20june 
 .2134.pdf 2109                                                 



klkjsdf"
Are 'text' and 'clean_text' unchanged? 'True'

したがって、stripは一度に1つの空白を削除します。OPの場合strip()は問題ありません。しかし、物事がさらに複雑になった場合、正規表現や同様のパターンは、より一般的な設定に役立つ場合があります。

実際に見る


0

翻訳してみてください

>>> import string
>>> print '\t\r\n  hello \r\n world \t\r\n'

  hello 
 world  
>>> tr = string.maketrans(string.whitespace, ' '*len(string.whitespace))
>>> '\t\r\n  hello \r\n world \t\r\n'.translate(tr)
'     hello    world    '
>>> '\t\r\n  hello \r\n world \t\r\n'.translate(tr).replace(' ', '')
'helloworld'

0

文字列の最初と最後だけの空白を削除したい場合は、次のようにします。

some_string = "    Hello,    world!\n    "
new_string = some_string.strip()
# new_string is now "Hello,    world!"

これはQtのQString :: trimmed()メソッドとよく似ており、内部の空白はそのままにして、先頭と末尾の空白を削除します。

しかし、QtのQString :: simplified()メソッドのように、先頭と末尾の空白を削除するだけでなく、連続するすべての内部空白を1つの空白文字に「詰め込む」場合は、次のように.split()との組み合わせを使用できます" ".join

some_string = "\t    Hello,  \n\t  world!\n    "
new_string = " ".join(some_string.split())
# new_string is now "Hello, world!"

この最後の例では、内部の空白の各シーケンスが1つのスペースに置き換えられ、文字列の先頭と末尾から空白が削除されています。


-1

通常、私は次の方法を使用しています。

>>> myStr = "Hi\n Stack Over \r flow!"
>>> charList = [u"\u005Cn",u"\u005Cr",u"\u005Ct"]
>>> import re
>>> for i in charList:
        myStr = re.sub(i, r"", myStr)

>>> myStr
'Hi Stack Over  flow'

注:これは、「\ n」、「\ r」、および「\ t」のみを削除するためのものです。余分なスペースは削除されません。


-2

文字列の中央から空白を削除するため

$p = "ATGCGAC ACGATCGACC";
$p =~ s/\s//g;
print $p;

出力:

ATGCGACACGATCGACC

1
この質問は、JavaScriptやperlではなくpythonに関するものです
phuclv '20

-17

これにより、文字列の最初と最後の両方からすべての空白と改行が削除されます。

>>> s = "  \n\t  \n   some \n text \n     "
>>> re.sub("^\s+|\s+$", "", s)
>>> "some \n text"

8
s.strip()正確にこれを行うのに、なぜ正規表現を使用するのですか?
Ned Batchelder

1
s.strip()最初の空白のみを処理しますが、他の不要な文字を削除した後に「検出された」空白は処理しません。これにより、最終リード後の空白も削除されます\n
Rafe

誰かがこの回答に反対票を投じたが、なぜそれが欠陥があるのか​​説明しなかった。あなたの恥(@NedBatchelder反対票を投じた場合は、質問を説明し、実際に私の答えで何も壊れていないことに言及していないので、逆にしてください)
Rafe

10
Rafe、あなたは再確認したいかもしれません:s.strip()正規表現とまったく同じ結果を生成します。
Ned Batchelder

3
@Rafe、あなたはそれをトリムと混同している。Stripは必要な操作を行います。
iMitwe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.