Pythonの文字列を分割する方法について解説しています。
文字列を分割するテクニックは様々です。
- 区切り文字(スペースやタブ含む)で分割
- 改行文字で分割
- パターンにマッチした部分で部分
- 文字数で分割
- リストを表現する文字列をリストに変換
例えば、以下のように、文字列をリストに分割する方法です。
"fuga,hoge,piyo"
→ ['fuga',' hoge', 'piyo']
このように文字列を分割してリスト化する方法を、現役のエンジニアが解説しています。
反対にリストを文字列に連結する方法は以下のページでまとめています。
結論
区切り文字で分割
text = 'foo,bar,baz'
l = text.split(',')
print(l)
# ['foo', 'bar', 'baz']
改行文字で分割
text = 'foo\r\nbar\nbaz'
l = text.splitlines()
print(l)
# ['foo', 'bar', 'baz']
パターンにマッチした部分で分割
import re
text = 'aaa111bbb222ccc'
l = re.split(r'\d+', text)
print(l)
# ['aaa', 'bbb', 'ccc']
文字数で分割
text = 'abcdefg'
print(text[:4])
# abcd
リストを表現する文字列をリストに変換
import ast
text = "['bar', 'buz', 'qux']"
l = ast.literal_eval(text)
print(l)
# ['bar', 'buz', 'qux']
実行環境
Python 3.9.2
区切り文字で分割 split()
文字列を区切り文字(セパレータ、separator)で分割し、リストを生成するには str.split()
を用います。
l = text.split(sep[, maxsplit])
sep | 区切り文字(セパレータ) |
maxsplit | 最大分割回数 |
例えば、区切り文字を ,
として分割するには、split()の第1引数 sep
に指定します。
split()の戻り値は常にlist
型です。
text = 'foo,bar,baz'
l = text.split(',')
print(l)
print(type(l))
# ['foo', 'bar', 'baz']
# <class 'list'>
セパレータのデフォルト値
sep
に何も指定しない(引数を渡さない)と、空白文字で分割します。
なお、空白文字には 改行文字 \n
(Windowsでは\r\n
)やタブ \t
も含まれます。
text = 'foo bar baz'
l = text.split()
print(l)
# ['foo', 'bar', 'baz']
text = 'foo\tbar\r\nbaz'
l = text.split()
print(l)
# ['foo', 'bar', 'baz']
最大分割回数の指定 maxsplit
maxsplit
に数値を指定すると、分割する回数を指定できます。
分割回数は左から順番に区切り文字の出現するごとにカウントします。
text = 'foo,bar,baz,qux'
l = text.split(',', maxsplit=2)
print(l)
# ['foo', 'bar', 'baz,qux']
例えば、最初の要素を除いて、2番目以降のすべての要素を抽出するときなどに活用できます。リストを操作するよりも簡単に書けます。
# 最初の要素以外を取得する
raw = 'a,b,c,d,e'
contents = raw.split(',', maxsplit=1)
print(contents[1])
# b,c,d,e
スペースを無視して分割
セパレータに半角スペースも含まれる場合、区切り文字で分割してもスペースが残ってしまいます。
text = "foo, bar, baz"
l = text.split(',')
print(l)
# ['foo', ' bar', ' baz']
スペースを除去するために、str.strip()
を活用します。
strip()
を実行すると文字列の両端にあるスペースを削除して返します。
s_space = " abc "
print(s_space.strip())
print(len(s_space.strip()))
# abc
# 3
str.split()
で取得したリストの各要素に str.strip()
を適用します。for
構文で一つづつ更新してもよいのですが、リスト内包表記で実行したほうがコードが短く、実行速度も高速です。
l = [c.strip() for c in text.split(',')]
print(l)
# ['foo', 'bar', 'baz']
ちなみに、同じ処理を for
文で書くと以下のようになります。
l = text.split(',')
for idx, c in enumerate(l):
l[idx] = c.strip()
print(l)
# ['foo', 'bar', 'baz']
改行文字で分割 splitlines()
str.split()
でも、区切り文字に改行文字 \n
などを指定すると、改行位置で分割するのは可能です。
しかし、str.split()
で区切り文字 sep
に指定できるのはあくまで1文字なので、例えばWindows系の改行文字 \r\n
が含まれる文字列では想定通りの分割ができません。
そこで、システムに依存せず改行文字で分割できる str.splitlines()
を使用します。
text = 'foo\r\nbar\nbaz'
print(text)
# foo
# bar
# baz
l = text.splitlines()
print(l)
# ['foo', 'bar', 'baz']
str.split()
のように、スペース、タブなどでは分割されません。
text = 'foo bar\tbaz'
l = text.splitlines()
print(l)
# ['foo bar\tbaz']
splitlines()で改行文字も保持する
リスト化した後も改行文字を保持(維持)するには引数keepends=True
とします。
text = 'foo\r\nbar\nbaz'
l = text.splitlines(keepends=True)
print(l)
# ['foo\r\n', 'bar\n', 'baz']
パターンにマッチした部分で分割 re.split()
str.split()
は特定の1文字を区切り文字に指定できましたが、あるパターンを区切り文字列(セパレータ)としたい場合もあります。
パターンにマッチした部分で文字列を分割するには正規表現モジュールre
のre.split()
を用います。
標準ライブラリなのでインストールは不要ですが、import は必要です。
import re
l = re.split(pattern, string[, maxsplit])
pattern | 区切り位置とするパターン(正規表現) |
string | 分割対象の文字列 |
maxsplit | 最大分割回数 |
英大文字の位置で分割する
import re
text = 'aaaAAbbbBBccc'
l = re.split(r'[A-Z]+', text)
print(l)
# ['aaa', 'bbb', 'ccc']
数字の位置で分割する
text = 'aaa111bbb222ccc'
l = re.split(r'\d+', text)
print(l)
# ['aaa', 'bbb', 'ccc']
例えば、箇条書きで付番されている箇所を区切り位置とするなら、次のようになります。
text = '1:aaa2:bbb3:ccc'
l = re.split(r'\d+:', text)
print(l)
# ['', 'aaa', 'bbb', 'ccc']
上のサンプルでは、0番目の要素が空文字となっています。
分割時に空の要素を作らないようにするには、リスト内包表記を活用します。
l = [e for e in re.split(r'\d+:', text) if e != '']
print(l)
# ['aaa', 'bbb', 'ccc']
文字数で分割
文字数により、特定の位置で文字列を分割するには、スライスを用います。
text = 'abcdefg'
print(text[:4])
# abcd
print(text[4:])
# efg
文字列の切り取り(抽出)やスライスについては以下の記事で詳しく解説しました。
スライスを用いて、部分文字列をリストにすることもできます。
l = , text[3:]]
print(l)
# ['abc', 'defg']
リストを表現する文字列をリストに変換
リストを表現する文字列を直接リストに変換したい場合はどうしたらよいでしょうか?
かんたんにイメージを説明すると、以下のようにprint()
で出力された文字列から、反対にリストに変換したいときのテクニックです。
l = ['a', 'b', 'c']
print(l)
# ['a', 'b', 'c']
標準ライブラリのastモジュールの ast.literal_eval()
で実現できます。
import ast
text = "['bar', 'buz', 'qux']"
l = ast.literal_eval(text)
print(l)
# ['bar', 'buz', 'qux']
print(type(l))
# <class 'list'>
ast.literal_eval()
は文字列をPythonのリテラルとみなして、各変数型に変換する関数です。そのため、リストのほかにも、以下のように辞書(dict)や数値(int)などに自動的に変換してくれます。
text = "{'name':'John', 'age':10}"
d = ast.literal_eval(text)
print(d)
# {'name': 'John', 'age': 10}
print(type(d))
# <class 'dict'>
json.loads()
にも似ていますが、こちらはあくまでJSONのフォーマットに従った文字列からしか変換できません。
import json
text = '["bar", "buz", "qux"]'
l = json.loads(text)
print(l)
# ['bar', 'buz', 'qux']
リストを結合して文字列にする
ここまでは文字列を分割してリスト化する方法を見てきましたが、反対にリストを結合して文字列にすることもできます。
以下の記事で詳しく解説しています。
Pythonの学習法について
Python の勉強が辛くなっていませんか?
Pythonは比較的取り組みやすい言語と言われていますが、プログラミング初心者にとっては分からないことだらけ。
ゼロから独学で勉強するのは厳しい道のりです。
今回、様々な現場、システム、言語を経験してきた現役エンジニアの立場から、初心者でも挫折しない学習方法を解説する記事を書きました。もちろん、お金をかけずに習得できる方法も解説しています。
できるだけストレスがかからない勉強法を解説しているので、ぜひ参考にしてみてくださいね。
今回参考にしたページ・資料
str.split 組み込み型 — Python 3.9.4 ドキュメント