Pythonの文字列を分割するには、splitとrsplitというメソッドを使います。これらのメソッドを使うと、文字列を空白や開業、タブ区切り、または指定の文字列や記号での区切りを簡単に行うことができます。
なお、splitメソッド以外の文字列分割方法は、『Pythonで文字列を分割する方法|split, splitlines, re.split』で解説しています。あわせて確認いただくと良いかと思います。
それではPythonのsplitメソッドについて見ていきましょう。
1. Pythonのsplitメソッドを使った文字列の分割
Pythonのsplitメソッドは、文字列を指定した区切り文字で分割してリスト型で返すメソッドです。
次のように書きます。
文字列.split(区切り文字, 分割の回数)
「区切り文字」は、分割する際の基準となる文字です。デフォルトでは、空白スペースごとになっています。「分割の回数」は、区切り文字をベースに、何個分割するかを指定します。デフォルトでは、全ての要素を分割する-1です。
それでは、実際に例を見ていきましょう。
1.1. splitメソッドの引数を空白にする場合
まず引数を空白にした場合、splitメソッドは自動的に、
- 空白
- 改行\n
- タブ\t
- 垂直タブ\v
- 復帰\r
- 改ページ\f
を区切りとして、文字列を分割します。次のコードで実際に確認してみましょう。
''' 引数を空白にすると自動で空白、改行(\n)、
タブ(\t)、改ページ(\f)等を区切りとして分割'''
# 1. 空白区切りで分割
str1 = 'a b c d e f g'
print(str1.split())
# 2. 改行コード区切りで分割
str2 = 'a\nb\nc\nd\ne\nf\ng'
print(str2.split())
# 3. タブコード区切りで分割
str3 = 'a\tb\tc\td\te\tf\tg'
print(str3.split())
# 4. 複合していても自動で分割
str4 = 'a b\nc\td e \nf g'
print(str4.split())
空白や改行コード、タブコードが自動で削除されて文字列が分割され、リスト化されていますね。#4のように空白や改行コード等が重複している場合でも一括で分割してくれる点も覚えておきましょう。
なお、次のようにsplitメソッドの返り値を、それぞれ別の変数に代入することができることも覚えておきましょう。
''' 分割結果はそれぞれ別の変数に代入することができます。 '''
fruits = 'apple, orange, banana'
a, b, c =fruits.split(', ') # ←区切り文字を', ''(カンマ+空白)にしています。
''' それぞれの変数に何が代入されているか確認しましょう。'''
print(a)
print(b)
print(c)
''' データ型は文字列型です。 '''
print(type(a))
この例では、まずfruitsという文字列を作り、それをsplitメソッドで分割しています。そしてメソッドの返り値をそれぞれa,b,cという変数に個別に代入しています。
結果、変数aにはappleが、変数bにはorangeが、変数cにはbananaが代入されています。こうしてメソッドの返り値を代入したオブジェクトの型は、リスト型ではなくstr型(文字列型)になります。
1.2. splitメソッドの第一引数で任意の区切り文字を指定する
splitメソッドの第一引数に任意の区切り文字を渡すと、それを基準にして分割してくれます。次のコードをご覧ください。
''' 区切り文字を指定するとそれを基準に分割'''
# 1. カンマ区切りで分割
str1 = 'a,b,c,d,e,f,g'
print(str1.split(',')) # ←引数に区切り文字を指定
# 2. 不要な文字(この場合は1)で区切る
str2 = 'a1b1c1d1e1f1g'
print(str2.split('1'))
#1ではカンマを区切り文字に指定しています。#2では数値の1を区切り文字に指定しています。出力結果を見ると、指定の区切り文字が削除されて文字列が分割されていますね。
このようにデフォルト(引数を空白にした時)以外の区切り文字を指定する場合は、第一引数で指定します。
1.3. splitメソッドの第二引数で分割回数を指定する
splitメソッドの第二引数では分割回数を指定することができます。第二引数を渡す場合は、第一引数の区切り文字も必須になります。そのため、空白や改行コード\nのようなデフォルトの区切り文字を基準に分割する場合でも、それを第一引数で指定する必要があります。以下でご確認ください。
''' 第二引数で分割回数を指定する。 '''
str1 = 'a b c d e f g'
print(str1.split(' ', 1)) # ←区切り文字を空白にして1回分割。
str2 = 'a\nb\nc\nd\ne\nf\ng'
print(str2.split('\n', 2)) # ←区切り文字を\nにして2回分割。
str3 = 'a, b, c, d, e, f, g'
print(str3.split(', ', 3)) # ←区切り文字をカンマ+空白にして3回分割
次のようにすると、より見やすいでしょう。
''' 3分割して変数に代入 '''
fruits = 'apple, banana, cherry, durian, figs'
a, b, c = fruits.split(', ', 2) # ←2回分割してそれぞれ変数に代入します。
print(a)
print(b)
print(c)
print('\n')
'''4分割して変数に代入'''
fruits = 'apple, banana, cherry, durian, figs'
a, b, c, d = fruits.split(', ', 3) # ←3回分割してそれぞれ変数に代入します。
print(a)
print(b)
print(c)
print(d)
2回分割すると全部で3つに分かれます。3回分割すると全部で4つに分かれます。
2. Pythonのrsplitメソッドを使った文字列の分割
rsplitメソッドは、splitの姉妹メソッドです。splitメソッドは前から分割していましたが、rsplitメソッドは後ろから分割します。違いはこの点だけです。
それでは見ていきましょう。まず、第二引数の分割回数を指定しない場合はsplitメソッドと全く同じです。
''' 第二引数の分割回数を指定しない場合は全てsplitメソッドと同じです。 '''
''' 1. 引数空白で空白区切り '''
quote = 'I have a dream'
print(quote.rsplit())
''' 2. 引数空白で改行コード区切り '''
haiku = '古池や\n蛙飛び込む\n水の音'
print(haiku.rsplit())
''' 3. 第一引数で区切り文字の指定 '''
policy = 'Geeks_can_change_the_world'
print(policy.rsplit('_'))
''' 4. 分割結果をそれぞれ別の変数に代入'''
fruits = 'apple, banana, cherry'
a,b,c = fruits.split(', ')
print(a)
print(b)
print(c)
分割回数を指定した時に初めて違いができます。splitメソッドは前から分割するのに対して、rsplitメソッドは後ろから分割します。次のコードをご覧ください。
''' 第二引数で分割回数を指定した時に違いがあります。 '''
fruits = 'apple, banana, cherry, durian, figs'
''' splitメソッドで3分割した場合'''
a,b,c = fruits.split(', ', 2)
print(a)
print(b)
print(c)
print('\n') # ←見やすいように改行を入れます。
''' rsplitメソッドで3分割した場合'''
x,y,z = fruits.rsplit(', ', 2) # ← rsplitメソッドで3分割
print(x)
print(y)
print(z)
このように、前と後ろのどちらから分割したいかによって使い分けることができます。
3. まとめ
最後に重要ポイントをまとめておきます。
- split, rsplit で分割した文字列はリスト型で返される。
- 区切り文字は任意。デフォルトは空白スペース。
- 分割回数は任意。デフォルトは-1(全て分割)。
- 区切り文字を指定しない場合、単なる空白スペースだけでなくタブや改行、改ページなども消去することができる。
- splitは前から、rsplitは後ろから分割する。両者の違いは分割回数を指定した時のみ。
- splitでリスト型で返された要素は、joinメソッドで文字列型に変換することができる。
以上の点に注意して活用しましょう。
コメント
コメント一覧 (1件)
詳しい解説をありがとうございます。
例えば splitメソッドで
str1 = ‘a b c d e f g’
print(str1.split(‘ ‘, 1))
abc やdfgだけを取り出したいときはどのようにすればいいのでしょうか?
print(str1.split(‘abc ‘, 1)) ではできませんでした。
よろしくお願いします。