プログラミングをしていると、文字列を操作することがよくあります。pythonには文字列を操作するための関数が豊富に用意されており、他の言語よりも簡単に文字列を処理することができます。
今回は、文字列の操作のうち、文字列の分割に焦点を絞って解説します。

for文で分割する

文字列を分割する最も単純な方法はfor文を使う方法です。

moji = 'python string split'
list = []
tmp = ''
for x in moji:
    if(x != ' '):
        tmp += x
    else:
        list.append(tmp)
        tmp = ' '
list.append(tmp)
print(list)

for文で一文字ずつ取り出して結合し、区切り文字(この例では空白)まで来たらリストに追加する、を繰り返すことで文字列を分割することができます。この方法でも問題はありませんが、コードが長くて少し見づらいですね。

split()を使う

for文を使った方法はコードが長く見づらいものでした。しかし、Pythonには文字列を分割するための関数が用意されています。それがsplit()です。split()の構文は以下の通りです。

変数 = 文字列.split(‘区切り文字’)

split()を使うと、引数として渡した区切り文字で文字列を区切ったリストが作られます。引数を空欄にした場合は空白で分割されます。

moji1 = 'python, string, split'
moji2 = 'python hello world'
list1 = moji1.split(',')  #「,」で区切る
list2 = moji2.split()   #未指定(空白で区切る)
print(list1)
print(list2)

実行結果

[‘python’, ‘ string’, ‘ split’]
[‘python’, ‘hello’, ‘world’]

また、split()なら文字列を分割する回数を指定することもできます。例えば、最初の1単語と、残りの文字列とで分けたいときに便利です。

moji = 'python, string, split'
list1 = moji.split(',')    #区切れるだけ区切る
list2 = moji.split(',', 1)  #1回だけ区切る
print(list1)
print(list2)

実行結果

[‘python’, ‘ string’, ‘ split’]
[‘python’, ‘ string, split’]

また、split()によく似たものとしてrsplit()があります。rsplit()は基本的にはsplit()と同じですが、分割する回数を指定した際に違いがあります。split()は、文字列の左端から指定した回数分割しますが、rsplit()では文字列の右端から指定した回数分割します。

moji = 'python, string, split'
list1 = moji.split(',', 1)   #左から1回分割
list2 = moji.rsplit(',', 1)  #右から1回分割
print(list1)
print(list2)

実行結果

[‘python’, ‘ string, split’]
[‘python, string’, ‘ split’]

splitlines()を使う

split()を使えば好きな区切り文字で簡単に文字を区切ることができます。区切り文字に改行文字(\n)を指定すれば、改行文字で分割することができますが、改行文字で分割するときはsplitlines()を使うこともできます。

変数 = 文字列.splitlines()

splitlines()の使い方はsplit()とほぼ同じです。split()と違うのは、splitは区切り文字を自由に指定できるのに対し、splitlines()は区切り文字は必ず改行文字になります。つまり、split()の引数に改行文字を渡したのと同じ結果になります。

moji = 'python\nstring\nsplit'
list1 = moji.split('\n')
list2 = moji.splitlines()
print(list1)
print(list2)

実行結果

[‘python’, ‘string’, ‘split’]
[‘python’, ‘string’, ‘split’]

これだけを見ると、わざわざsplitlinesを使う必要はないように思えます。しかし、splitlines()がsplit()と違うのは、引数にTrueを渡すことで、改行文字を残したうえで分割することができる点です。

moji = 'python\nstring\nsplit'
list1 = moji.split('\n')
list2 = moji.splitlines(True)  #引数にTrueを渡す
print(list1)
print(list2)
['python', 'string', 'split']
['python\n', 'string\n', 'split']

split()を使って同様のことを実現する場合は、分割した後にfor文を回して改行文字を付け加える必要があります。改行文字を残して分割したいときは、splitlines()を使うようにしましょう。

partitionで分割する

Pythonで文字列を分割するには、partition()を使うという方法もあります。partition()の基本的な構文は以下の通りです。

変数 = 文字列.partiotion(‘区切り文字’)

partition()の構文もsplit()やsplitlines()によく似ていますが、実行した結果には少し違いがあります。partition()は最初の区切り文字の場所で文字列を分割し、(区切り文字の前の文字列、区切り文字、区切り文字のあとの文字列)という形式のタプルを返します。

moji = 'python string split'
list1 = moji.partition(' ')  #最初の空白で区切る
print(list1)

実行結果

(‘python’, ‘ ‘, ‘string split’)

もし区切り文字が見つからない場合は、元の文字列と、後ろに2つの空文字列が入ったタプルが返されます。

list1 = moji.partition('\n')
print(list1)

実行結果

(‘python string split’, ”, ”)

また、partition()と逆の動きをするrpartition()もあります。rpartition()は最後の区切り文字の場所で文字列を分割し、(区切り文字の前の文字列、区切り文字、区切り文字のあとの文字列)という形式のタプルを返します。

moji = 'python string split'
list1 = moji.rpartition(' ')
print(list1)

実行結果

(‘python string’, ‘ ‘, ‘split’)

rpartition()では、区切り文字が見つからない場合は、2つの空文字列の後ろに元の文字列が入ったタプルが返されます。

moji = 'python string split'
list1 = moji.rpartition('\n')
print(list1)

実行結果

(”, ”, ‘python string split’)