[解決!Python]文字列から空白文字を削除するには:解決!Python
文字列のstrip系のメソッド、replaceメソッド、maketrans/translateメソッド、splitメソッドを使って文字列から空白文字を削除する方法を紹介する。
* 本稿は2022年6月7日に公開された記事をPython 3.12.0で動作確認したものです(確認日:2023年12月1日)。
# 文字列前後の空白文字を削除
s = ' sample string '
print(s, end='*\n') # sample string *
result = s.strip()
print(result, end='*\n') # sample string*
# 文字列先頭の空白文字を削除
s = ' sample string '
print(s, end='*\n') # sample string *
result = s.lstrip()
print(result, end='*\n') # sample string *
# 文字列末尾の空白文字を削除
s = ' sample string '
print(s, end='*\n') # sample string *
result = s.rstrip()
print(result, end='*\n') # sample string*
# 上記は全角の空白文字や改行文字も削除する
s = ' \tサンプル 文字列\n '
print(s, end='*\n')
# 出力結果
# サンプル 文字列
# *
result = s.strip()
print(result, end='*\n') # サンプル 文字列*
# replaceメソッドで文字列に含まれている空白文字を削除
s = '+ foo bar baz '
print(s, end='*\n') # + foo bar baz *
result = s.replace(' ', '')
print(result) # +foobarbaz
# 複数の空白文字をreplaceメソッドで削除
s = ' \tサンプル 文字列\n '
result = s.replace(' ', '').replace('\t', '').replace('\n', '')
print(result) # サンプル文字列
# 文字列のmaketrans/translateメソッドを使用する
d = { k: '' for k in [' ', ' ', '\t', '\n']}
tbl = str.maketrans(d)
s = ' \tサンプル 文字列\n '
result = s.translate(tbl)
print(result) # サンプル文字列
# 文字列に含まれている空白文字を削除
s = ' \tサンプル \t 文字列\n '
print(s, end='*\n')
# 出力結果:
# サンプル 文字列
# *
result = ''.join(s.split())
print(result) # サンプル文字列
# 文字列中の連続する空白文字を単独の空白文字にする
s = ' \tサンプル \t 文字列\n '
print(s, end='*\n')
# 出力結果:
# サンプル 文字列
# *
result = ' '.join(s.split())
print(result) # サンプル 文字列
文字列のstrip/lstrip/rstripメソッド
文字列の先頭または末尾にある空白文字を削除するには、以下の3つのメソッドが使える。
- stripメソッド:文字列の先頭/末尾にある空白文字を削除
- lstripメソッド:文字列の先頭にある空白文字を削除
- rstripメソッド:文字列の末尾にある空白文字を削除
これらのメソッドはいずれも引数を与えなければ、空白文字やタブ文字、改行文字などを文字列の先頭または末尾から削除する。これらは呼び出しに使用した文字列を改変するのではなく、文字列から空白文字を取り除いた「新しい文字列」を戻り値とする。
stripメソッドは文字列の先頭と末尾にある空白文字を削除するものだ。その使用例を以下に示す。
s = ' sample string '
print(s, end='*\n') # sample string *
result = s.strip()
print(result, end='*\n') # sample string*
この例では3つの半角の空白文字を先頭と末尾に含む「 sample string 」に対してstripメソッドを呼び出している。そのため、stripメソッドを呼び出すと「 sample string 」から前後の空白文字が削除された「sample string」が得られる。また、print関数呼び出しでは末尾がどこかを明確にするため、「*」に続けて改行を行うようにしている。その結果、「sample string*」と最後に「*」が表示されている(以下、同様)。
lstripメソッドは文字列の先頭にある空白文字を削除する。以下に例を示す。
s = ' sample string '
print(s, end='*\n') # sample string *
result = s.lstrip()
print(result, end='*\n') # sample string *
この例では文字列の末尾にある空白文字は削除されないので、最後のprint関数の呼び出しでは「sample string *」のように3つの空白文字の後に「*」が表示されている点に注目。
rstripメソッドは文字列の末尾にある空白文字を削除する。以下に例を示す。
s = ' sample string '
print(s, end='*\n') # sample string *
result = s.rstrip()
print(result, end='*\n') # sample string*
この例では文字列末尾の空白文字が削除されたので、「string」に続けて「*」が表示されている。また、先頭には3つの空白文字が含まれている。
上述した通り、strip系のメソッドはいわゆる半角の空白文字だけではなく、全角の空白文字やタブ文字、改行文字なども削除する。以下に例を示す。
s = ' \tサンプル 文字列\n '
print(s, end='*\n')
# 出力結果
# サンプル 文字列
# *
変数sには' \tサンプル 文字列\n 'のようにタブ文字(\t)と改行(\n)を含んだ文字列が代入されている。画面では分かりづらいが空白文字は全角の空白文字(コードポイントは0x3000)だ。よって、これをprint関数で出力すると上のように全角の空白文字2つの後、次のタブ位置で「サンプル 文字列」がそろうように出力され、そこで改行が行われて、残りの文字列(空白文字3つと「*」)が出力される。
この文字列にstripメソッドを呼び出すと、文字列の先頭と末尾にある全角の空白文字/タブ文字/改行文字が削除され、次のように出力される。
result = s.strip()
print(result, end='*\n') # サンプル 文字列*
ここまで文字列の先頭または末尾にある空白文字を削除する方法を紹介してきた。文字列中にある空白文字を削除する簡単な方法は次に紹介するreplaceメソッドを使うことだ。また、maketrans/translateメソッドも使える。
文字列のreplace/maketrans/translateメソッド
replaceメソッドは第1引数に置換前の文字列を、第2引数に置換後の文字列を指定して呼び出す。
s = 'foo'
result = s.replace('o', 'a')
print(result) # faa
そこで第1引数に空白文字を、第2引数に空文字列「''」を指定することで、文字列に含まれる全ての空白文字を削除できる。以下に例を示す(最後のprint関数呼び出しではendパラメーターの指定をやめていることに注意。これは空白文字を全て削除するので、どこまで空白文字があるかを明確にする必要がないからだ。以下、同様)。
s = '+ foo bar baz '
print(s, end='*\n') # + foo bar baz *
result = s.replace(' ', '')
print(result) # +foobarbaz
ここでは「+」で始まり、末尾には空白文字を含んだ文字列'+ foo bar baz 'を変数sに代入している。そして、この文字列でreplaceメソッドを呼び出している。第1引数には半角空白文字、第2引数には空文字列を指定しているので、これにより文字列中の半角空白文字が全て削除される。このため、最後のprint関数の呼び出しでは、'+foobarbaz'が出力されている。
ただし、replaceメソッドでは置換前の文字列を明示的に指定する必要があるので、replaceメソッドを使って文字列から空白文字とタブ文字と改行文字を削除したいといった場合には、以下のように連続して呼び出す必要がある。
s = ' \tサンプル 文字列\n '
result = s.replace(' ', '').replace('\t', '').replace('\n', '')
print(result) # サンプル文字列
この例では、文字列sには全角の空白文字、タブ文字、改行文字が含まれている。これらを全て文字列から削除するには、それぞれ(と空文字列)を指定してreplaceメソッドを繰り返し呼び出す(このようなreplaceメソッド呼び出しの連鎖が可能なのは、このメソッドの戻り値が文字列だからだ。つまり、1つ目のreplaceメソッドの戻り値である文字列を使って2つ目のreplaceメソッドが呼び出され、その戻り値である文字列を使って3つ目の呼び出しが行われ、その戻り値が変数resultに代入される)。
あるいは、文字列のmaketrans/translateメソッドを使う方法も考えられる。以下に例を示す。
d = { k: '' for k in [' ', ' ', '\t', '\n']}
tbl = str.maketrans(d)
s = ' \tサンプル 文字列\n '
result = s.translate(tbl)
print(result) # サンプル文字列
ここでは、maketransメソッドを使って、先ほどと同様な全角の空白文字/タブ文字/改行文字を空文字列に変換するためのテーブルを作成し、先ほどと同じ文字列でtranslateメソッドを呼び出して、このテーブルを渡している。
文字列のsplit/joinメソッド
replace/maketrans/translateメソッドを使っても、文字列に含まれている全ての空白文字を削除できるが、少し面倒くさい。こういうときにはsplit/joinメソッドを使ってもよい。
引数を何も指定しないでsplitメソッドを呼び出した場合、文字列中の空白文字(半角空白文字、全角空白文字、タブ文字、改行文字など)を区切り文字として文字列が分割され、分割された部分文字列を要素とするリストが作成される。
以下に例を示す。変数sに代入される文字列は先ほどと同様だが、「サンプル」と「文字列」の間には全角の空白文字、タブ文字、半角の空白文字が含まれている。
s = ' \tサンプル \t 文字列\n '
result = s.split()
print(result) # ['サンプル', '文字列']
文字列中で空白文字が連続している部分は1つの区切りとして扱われる(そのため、「サンプル」と「文字列」の間にある全角の空白文字、タブ文字、半角の空白文字はまとめて1つの区切りとして扱われる)。作成されたリスト(['サンプル', '文字列'])は文字列のみが要素となっているので、これをjoinメソッドに渡すことで、joinメソッドの呼び出しで使用している文字列を区切り文字として、リストの要素を結合できる。
これをコードにすると次のようになる。
s = ' \tサンプル \t 文字列\n '
print(s, end='*\n')
# 出力結果:
# サンプル 文字列
# *
result = ''.join(s.split())
print(result) # サンプル文字列
ここでは空文字列('')でjoinメソッドを呼び出しているので、'サンプル文字列'のように元の文字列' \tサンプル \t 文字列\n 'から空白文字が全て削除されたものが得られている。
joinメソッドの呼び出しに使用する文字列を変更することで、任意の文字列を区切りとして使える。例えば、文字列中の連続する空白文字を1つの空白文字に置き換えたい、といったときには、空文字列''ではなく、' 'でjoinメソッドを呼び出せばよい。
s = ' \tサンプル \t 文字列\n '
result = ' '.join(s.split())
print(result) # サンプル 文字列
この他にも正規表現を使って空白文字を削除する方法があるが、これについては別稿で紹介する。
Copyright© Digital Advantage Corp. All Rights Reserved.