split関数
前回、Pythonの重複を含まないデータ型であるSet型を勉強しました。
今回は文字列を分割する「split関数」を勉強していきましょう。
実はsplit関数はこれまでにも何度も出てきていますが、こうやって自分でまとめていませんでした。
ただ最近、結構使う場面があったのでそれならばと思い、一度まとめてみることにしたというのが今回の記事なわけです。
それでは始めていきましょう。
split関数の基本
まずはsplit関数の基本からです。
一番簡単な使い方としては「文字列 .split(‘分割する文字列’)」です。
test1 = 'a, b, c, d, e, f'
print(test1.split(','))
実行結果
['a', ' b', ' c', ' d', ' e', ' f']
ここで注意することは「分割する文字」は出力からは削除されます。
なので上記の例では「[‘a,’, ‘ b,’, ‘ c,’, ‘ d,’, ‘ e,’, ‘ f’]」ではなくて「[‘a’, ‘ b’, ‘ c’, ‘ d’, ‘ e’, ‘ f’]」になります。
またそれぞれのアルファベットの間に「,」(カンマ)だけでなく「 」(半角スペース)も入っていますが、そちらは「分割する文字」に含まれていませんので、出力に残っていることを注意してください。
もし半角スペースもなくしたい場合は分割する文字に「, 」(カンマと半角スペース)を指定します。
test1 = 'a, b, c, d, e, f'
print(test1.split(', '))
実行結果
['a', 'b', 'c', 'd', 'e', 'f']
ちなみに上記のように複数の文字列を入れた場合は完全一致した場合だけその文字で分割されます。
つまり分割する文字が「, 」(カンマと半角スペース)の場合は、あくまでも「, 」(カンマと半角スペース)がこの順である場所で分割され、「,」(カンマ)だけや「 」(半角スペース)だけでは分割されません。
test2 = 'a,, b, c,, d, e,, f'
print(test2.split(', '))
実行結果
['a,', 'b', ' c,', ' d', 'e,', 'f']
またここまでの例では文字列を一度変数に格納してから、その変数に対してsplit関数を用いていますが、直接文字列にsplit関数を使うことも可能です。
print(('a, b, c, d, e, f').split(', '))
実行結果
['a', 'b', 'c', 'd', 'e', 'f']
改行コードのように目に見える形で出力されない文字に関しても分割することができます。
test3 = 'a\nb\nc\nd\ne\nf'
print(test3)
print(test3.split('\n'))
実行結果
a
b
c
d
e
f
['a', 'b', 'c', 'd', 'e', 'f']
分割数と分割の方向
次に分割数と分割される方向を見ていきます。
先ほどのsplit関数ですが、さらにオプションとして分割数を追加することができます。
その場合は「文字列 .split(‘分割する文字列’, 分割数)」です。
test1 = 'a, b, c, d, e, f'
print(test1.split(', ', 2))
実行結果
['a', 'b', 'c, d, e, f']
上記の例では分割数を「2」としているので、左から2回、分割する文字で分割され、その後は分割されていません。
ここで重要なのは左から分割されているということです。
となると右側から分割したい時はどうするのか、という疑問が浮かび上がります。
もちろんその関数も準備されており、 「split」の代わりに「rsplit」を用います。
test1 = 'a, b, c, d, e, f'
print(test1.rsplit(', ', 2))
実行結果
['a, b, c, d', 'e', 'f']
分割後の要素の取得
split関数により分割された文字列はリスト形式で返されますので、インデックスを指定することでそれぞれの要素を取得することができます。
test1 = 'a, b, c, d, e, f'
print(test1.split(', ')[0])
print(test1.split(', ')[1])
print(test1.split(', ')[2])
print(test1.split(', ')[3])
print(test1.split(', ')[4])
print(test1.split(', ')[-1])
実行結果
a
b
c
d
e
f
複数の文字で分割する方法
文字列を分割していると、複数の文字列で分割したいことが出てきます。
しかしながらsplit関数では複数の分割する文字列を一度に指定することはできません。
正規表現のモジュールである「reモジュール」を使えばできるようですが、個人的に正規表現はあまり好きではないので、split関数を使ってやってみましょう。
一つ目はfor文を使って文字列を段階的に分割していく方法です。
test4 = 'a, b. c, d. e, f'
temp1 = test4.split('. ')
print(temp1)
result = []
for i in temp1:
temp2 = i.split(', ')
for j in temp2:
result.append(j)
print(result)
実行結果
['a', 'b', 'c', 'd', 'e', 'f']
これだと分割する文字列の分だけfor文が必要で分割する文字列が多い場合は複雑なプログラムになってしまいそうです。
もう一つは「replace関数」を使って分割する文字列を1種類に減らしてから分割する方法です。
ちなみに「replace関数」は「文字列.replace(‘置換したい文字列’, ‘置換後の文字列’)」で文字列の置換ができます。
test4 = 'a, b. c, d. e, f'
temp1 = test4.replace('.', ',')
print(temp1.split(', '))
実行結果
['a', 'b', 'c', 'd', 'e', 'f']
ちなみにreplace関数は何度も重ねて使う、つまり「文字列.replace(‘置換前文字列1’, ‘置換後文字列1’).replace(‘置換前文字列2’, ‘置換後文字列2’))」のように使うことができるので、先ほどのfor文を使った例よりは多数の文字で一括で分割したい場合により簡単に書けると思います。
また最初の文字列を書き換えてしまっていいのなら、for文とreplace関数を使って、こんな感じでも複数の文字列で分割することができます。
test5 = 'a, b# c$ d% e^ f'
split_str = [',', '#', '$', '%', '^']
for string in split_str[1:]:
test5 = test5.replace(string, ',')
print(test5.split(split_str[0]))
実行結果
['a', ' b', ' c', ' d', ' e', ' f']
文字列の分割に関しては結構ケースバイケースなところがあるので、その都度対応していくしかないかと思います。
またその際は「綺麗なプログラム」を目指すよりも「多少汚くてもちゃんと分割できる」を重視する方がいいときもあります。
(というよりも汚くなりがちです…まだまだ下手なのかも知れませんが)
次回は今回出てきたreplace関数をもう少し詳しく見ていきましょう。
ではでは今回はこんな感じで。
コメント