Python Tech 文字列

Python 文字列を分割してリスト化する方法の一覧

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文字を区切り文字に指定できましたが、あるパターンを区切り文字列(セパレータ)としたい場合もあります。

パターンにマッチした部分で文字列を分割するには正規表現モジュールrere.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 ドキュメント

re.split re --- 正規表現操作 — Python 3.9.4 ドキュメント

ast.literal_eval ast --- 抽象構文木 — Python 3.9.4 ドキュメント

  • この記事を書いた人

次世代ペンギン

長いのでペンギンとお呼びください。システム開発・プログラミングのお仕事をしています。甘味とコーヒーは生命線。多くの人に役立つ情報のシェアが目標です。

人気の記事

1

会社員でプログラマーとして働いている人、インフラやネットワークのエンジニアとして働いている人の中には、フリーランスのプログラマーとして独立、もしくは転向したい人もいるので ...

2

キャリアアップのため、または高収入を目指して、しっかりプログラミングを学びたいという人が増えてきましたね。 この記事では現役のエンジニアである私が、実際に仕事で稼げるよう ...

3

フリーランスのプログラマーにとって収入の向上に最も直結するのはスキルです。 必要なスキル、スキルの獲得方法が気になる人も多いでしょう。 また、これからフリーランスを目指す ...

4

Vuetifyの v-progress-circular コンポーネントは、数値データや処理状況を環状(円状)のデザインで教えてくれるUIデザインです。 ローディングのス ...

5

Vuexのstore(ストア)を使うと、各コンポーネント間で個別にデータのやり取りすることなく、データを一元的に管理できます。Vueでは欠かせない機能といえるでしょう。 ...

-Python, Tech, 文字列
-, , ,

© 2021 ペンギンのーと