Pythonで文字列を分割する方法は複数あります。ここでは、それぞれ比較しながら紹介し、使い方の違いを解説していきます。
1. 指定の区切り文字で文字列を分割(splitメソッド)
Pythonで文字列を指定の区切り文字で分割する場合は文字列型メソッドのsplit()を使います。
splitメソッドは文字列の分割結果をリスト型で返します。
引数を省略した場合はデフォルトで、空白、改行\n、タブ\t、垂直タブ\v、復帰\r、改ページ\fで分割します。これらが連続している場合はまとめて処理して文字列を分割します。
いくつか例を見ていきましょう。なお、
ではより詳しく解説しているので、ぜひそちらもご覧ください。
1.1. 空白区切りで分割
''' splitメソッドで文字列を分割 '''
''' 不要なコードが混ざった文字列 '''
str = 'one two\tthree\nfour\tfive'
print(str)
print('\n') # ←見やすいように改行を入れます。
''' splitメソッドで不要なコードを削除した上で分割 '''
print(str.split())
print('\n') # ←見やすいように改行を入れます。
''' splitメソッドの返り値はリスト型です。 '''
print(type(str.split()))
空白等が削除された上で文字列が分割されていますね。なお、splitメソッドの返り値はリスト型であることもご確認ください。
1.2. 指定の文字区切りで分割
splitメソッドの第一引数でデフォルト以外の区切り文字を指定することができます。次のコードでは、区切り文字を’, ‘(カンマ+空白)に指定しています。
''' 第一引数で区切り文字を指定して分割 '''
fruits = 'apple, banana, cherry, durian, figs'
print(fruits.split(', '))
きれいに文字列が分割されていますね。
1.3. 分割回数を指定して分割
第二引数まで渡すと、分割回数を指定することができます。以下では、分割回数を3回としているので全部で4分割されます。
''' 第二引数で分割回数を指定して分割 '''
print(fruits.split(', ', 3))
分割とスライスを併用すると任意の要素だけ取り出すことができます。スライスについては、
でご確認ください。
''' 分割した任意の要素だけをスライスして取り出すことも可能です。 '''
print(fruits.split(', ', 2)[0]) # ←インデックス番号0番を取り出す
print(fruits.split(', ', 2)[1]) # ←インデックス番号1番を取り出す
print(fruits.split(', ', 2)[2]) # ←インデックス番号2番を取り出す
print(fruits.split(', ', 2)[-1]) # ←インデックス番号-1番を取り出す
2. 指定の区切り文字で文字列を後ろから分割(rsplitメソッド)
rsplit()はsplit()と同じく文字列を指定の区切り文字で分割する文字列型メソッドです。
違いはspilit()は前から分割していくのに対して、rsplitは後ろから分割する点です。この違いは、第二引数の分割回数を指定した場合にのみ見られます。次のコードで確認しましょう。
''' rsplitは後ろから分割します。 '''
''' 分割回数を指定しない場合はsplitメソッドと全く同じ '''
str = 'one two\tthree\nfour\tfive'
print(str.rsplit())
print('\n') # ←見やすいように改行を入れます。
''' 分割回数を指定した場合に違いができます。 '''
fruits = 'apple, banana, cherry, durian, figs'
print(fruits.rsplit(', ', 2))
print('\n') # ←見やすいように改行を入れます。
' スライスして取り出してみましょう。'
print(fruits.rsplit(', ', 2)[0]) # ←インデックス番号0番を取り出す
print(fruits.rsplit(', ', 2)[1]) # ←インデックス番号1番を取り出す
print(fruits.rsplit(', ', 2)[2]) # ←インデックス番号2番を取り出す
3. 改行で文字列を分割(splitlinesメソッド)
splitlines()は文字列を改行部分で分割します。リスト型で返す点はsplit()と同じです。
改行含みの文字列を分割する時は、split()やrsplit()だけでは思ったように処理できない時があります。そんな時にsplitlines()を知っておくと便利です。例えば、次のコードをご覧ください。
''' splitlinesメソッドは改行コードで分割 '''
str = '1 apple\n2 banana\n3 cherry'
print(str)
print('\n') # ←見やすいように改行を入れます。
''' splitメソッドと見比べてみましょう。 '''
print(str.split()) # splitメソッドは空白や改行、タブなどをまとめて削除して分割
print(str.splitlines()) # splitlineメソッドは改行のみで分割
この文字列をsplit()で分割した場合、’1′, ‘apple’, ‘2’, ‘banana’ というように空白も区切り文字として処理されます。この時、splitlines()を使えば、’1 apple’, ‘2 banana’ というように空白はそのままで純粋に改行コードだけで文字列を分割することができます。
なお、splitlinesメソッドにとっての「改行」には、以下が含まれています。
- 改行:\n
- 復帰:\r
- 改行+復帰:\r\n
- 垂直タブ:\v
- 改ページ:\f
splitメソッドはこれに空白も含まれます。改めて以下のページで確認してみてください。
なお、splitlines()の引数にはTrueだけ渡すことができます。この場合、分割結果から改行コードは削除されず、そのまま残されます。
'''splitlinesメソッドで改行コードを残した上で分割したい場合、引数にTrueと渡します。 '''
str1 = '1 apple\n2 banana\n3 cherry'
print(str1.splitlines(True))
str2 = '1 apple\t2 banana\t3 cherry'
print(str2.splitlines(True))
str3 = '1 apple\r\n banana\r\n3 cherry'
print(str3.splitlines(True))
split()とsplitlines()の違いはもう一つあります。それは末尾にも改行コードがある場合です。その場合、split()では分割の末尾に空の要素が入ります。splitlines()では末尾に空の要素は入りません。
以下で確認しておきましょう。
''' 文字列の末尾に改行コードがある場合に違いができます。 '''
str = '1 apple\n2 banana\n3 cherry\n'
print(str.split('\n')) # ←末尾に空の要素ができる。
print(str.splitlines()) # ←末尾に空の要素はできない。
4. 複数の区切り文字で文字列を分割(re.split関数)
split()やrsplit()では、指定の区切り文字に完全一致した場合のみ分割します。そして区切り文字を複数同時に指定することはできません。もし複数の区切り文字を同時に指定したい時、もしくは正規表現で区切り文字を指定したい時は、reモジュールのre.split関数を使います。
なおモジュールについてわからない場合は、次のページで確認しておきましょう。
それでは、re.split()の使い方を見ていきましょう。これは第一引数に区切り文字、第二引数に分割対象の文字列、第三引数に分割回数を渡します。
4.1. 複数の区切り文字を指定して分割
まず、正規表現を使わない方法です。
以下のコードのように、re.split()では正規表現を使わなくても、複数の区切り文字を同時に指定することができます。
''' 複数の区切り文字を同時に指定するにはre.split関数を使う。 '''
import re # ←必ずreモジュールをインポートする必要があります。
nums = 'one123two456three789four'
print(nums)
''' このような場合、splitメソッドではうまく分割することができません。'''
print(nums.split('123'))
''' re.split関数を使うと区切り文字を一度に複数指定することができます。 '''
print(re.split('123|456|789', nums)) # ← | で区切り文字を複数指定することができます。
print(re.split('one|two|three|four', nums)) # ← | で区切り文字を複数指定することができます。
''' 第三引数に分割回数を指定することができます。 '''
print(re.split('123|456|789', nums, 2)) # ←3分割
print(re.split('one|two|three|four', nums, 3)) # ←4分割
正規表現がわからない間はこの方法を使っても良いでしょう。
4.2. 正規表現で区切り文字を指定して分割
正規表現を学ぶと、次のようにさらにシンプルなコードを書けるようになります。
''' 正規表現に詳しいとより効率的にコードを書くことができます。 '''
import re # ←必ずreモジュールをインポート(同一ファイル内ではインポートは1回でOK)。
nums = 'one123two456three789four'
print(nums)
''' 正規表現で「全ての数値」を区切り文字に指定 '''
print(re.split('\d+', nums))
''' 正規表現で「全ての数値以外」を区切り文字に指定 '''
print(re.split('\D+', nums)) # ←正規表現で区切り文字を指定して分割。
正規表現の書き方を学習した後に、色々試してみると良いでしょう。
5. まとめ
Pythonで文字列を分割するには4つの方法があります。
- split():任意の区切り文字で前から分割
- rsplit():任意の区切り文字で後ろから分割
- splitlines():改行で分割
- re.split():複数の区切り文字を同時に指定、または区切り文字を正規表現で指定
それぞれに使い勝手が違うので、実際に試してみることが大事です。なお、分割した文字列は色々な方法で連結することができます。それに関しては、次のページで確認しておきましょう。
コメント
コメント一覧 (1件)
区切り文字が見つからない時の結果についても、記載が必要と考えます。
1.メンバーのリスト
2.エラーの発生