Pythonのsplitで文字列を分割する方法
プログラミングを行っていると、データに含まれる文字列を加工する必要に駆られることが多々あります。とくに文字列を分割・結合・比較することは、本当に多いです。
そこで今回は、Pythonを使って文字列を「分割する・抽出する・切り出す」ことにフォーカスを当てた解説を行います。
Pythonは比較的短い記述量でやりたいことが実現できるので、サクッとスクリプトを作成するのにうってつけの言語です。さらにネット上にリファレンスも豊富にあるので、初心者でもあまり時間をかけずに調べることができるのも強みです。
それでは早速見ていきましょう。
splitの意味とは
Pythonのsplitを使う意味ですが、かんたんに文字列を分割するためです。
多くのシステムで扱うデータ形式はスペース、タブ、カンマなどで区切られています。とはいえスペースなどで区切られたデータをプログラム内で処理したいとき、多くの場合はそのままでは使いにくいです。
そのためリスト化したり、欲しい文字列の一部だけを切り出したりします。このように文字列をリスト化したり、切り出したりする作業にsplitは大いに役立ちます。
次はサンプルコードを使ってsplitの具体的な使い方を解説します。
文字列を分割する4つのやり方
ここではsplitを使って文字列を分割する方法を、サンプルコードを交えて説明します。
splitを使った書き方はシンプルでわかりやすいので、はじめてpythonを触る人でもすぐに慣れるでしょう。
また、Pythonにはsplitだけではなくrsplit、splitlinesといった、splitから派生した機能もあるので、それらについても触れていきます。
splitを使って文字列を分割する
まずは一番オーソドックスな方法であるsplitを使ったやり方を説明します。
splitを使うには以下のように書きます。
文字列.split(区切り文字、分割したい位置)
splitは、区切り文字をひとつだけ指定できます。
例えば、カンマで区切られたテキストを分割したいのであればカンマを、カンマ以外であれば、ドットやスペース、タブなども指定できます。
また、分割した文字列は自動的にリスト形式に変換されるので、区切られたデータ同士を比較するときは非常に便利です。
サンプルコードは以下の通りです。
## スペースで分割
sample = "a b c d e f"
print(sample.split())
## 左から1要素(a)だけ分割
sample = "a b c d e f"
print(sample.split(' ', 1))
print(sample.split(' ', 1)[0])
print(sample.split(' ', 1)[1])
## カンマで分割
sample_comma = "a,b,c,d,e,f"
print(sample_comma.split(','))
複数の区切り文字を指定して文字列を分割する
先ほどの例では、splitにはひとつの区切り文字しか指定できませんでした。しかし実際の作業を行うにあたっては、複数の区切り文字を指定したいことの方が多いでしょう。
じつはPythonのsplitには複数の区切り文字を指定して、文字列を分割する方法が準備されています。複数の区切り文字を使ってsplitを行うには、reというPythonのモジュールをimportする必要があります。
re.splitは以下のように使います。
re.split(正規表現, 文字列)
なお、reモジュールについては後ほど詳しく説明します。
## 正規表現を使うため
import re
## 複数の区切り文字で分割
sample_patterns = "a,b_c,d;e,f"
print(re.split('[,_;]', sample_patterns))
rsplitで文字列を右から分割する
rsplitは、右から左に向かって文字列を分割します。
splitは左から右へ向かって文字列を分割するため、rsplitの"r"は「右」「反対の」といった意味を示していると思われます。
使い方はsplitと同じです。
## 右から1要素(f)だけ分割
sample = "a b c d e f"
print(sample.rsplit(' ', 1))
splitlinesを利用して改行で分割する
splitlinesは、改行する部分で文字列を分割します。
改行していないテキストをそのまま読み込み、改行ごとのテキストをリスト化したい時などは重宝する関数です。
使い方はsplitと同じです。
## 改行で分割
sample_lines = "a A 1\nb B 2\nc C 3\n"
print(sample_lines.splitlines())
文字列を抽出するやり方
「splitで複数の区切り文字を指定する方法」で出てきたreモジュールですが、これはPythonで「正規表現を使う」ことを宣言しています。
正規表現とはある文字列のパターンを、抽象的に表現するための記述方法です。例えば、*は「文字・数字・記号のどれか」、[123]は「1か2か3」、といった表現方法です。
正規表現はそれだけで本1冊分になるくらい、膨大な量の情報があります。とはいえ、基本的なところはPythonの公式サイトやQiita、Stackoverflowなどにある情報を見るだけで十分な知識を得ることが可能です。
プログラミングをはじめて間もない頃であれば正規表現に触れる必要は薄いですが、使いこなせればとても便利なものになるので、もし気が向いたらチャレンジしてみてください。
###re.splitで正規表現を使い、文字列を抽出する
re.splitを使って、簡単な正規表現を利用した文字列の抽出をPythonのサンプルコードで説明します。
re.split(正規表現, 文字列)
正規表現に該当する箇所の[A-Z]ですが、これは「A~Zのどれか」を意味しています。つまりこのコードは英大文字を区切り文字として扱い、文字列を分割することになります。
## 正規表現を使うため
import re
## 大文字区切りで分割
sample_upper_char = "aAbBcCdDeEf"
print(re.split('[A-Z]', sample_upper_char))
文字列を切り出すやり方
Pythonには、スライスという機能が存在します。スライスとは文字通り「切りとる」という意味で、Pythonを使って文字列を切り出す機能です。
単純に文字列を切り出すだけではなく、文字列を反転させたり、n文字飛ばしで文字列を取得したい場合などにも利用できるため、非常に汎用性の高いツールです。
スライスを使って文字列を切り出す
スライスの使い方は以下の通りです。
文字列[開始位置:終了位置:増分(n文字飛ばし)]
## サンプルの文字列
sample = "abcdefgh"
## 頭から3文字分
print(sample[:3])
## 頭から4文字から終わりまで
print(sample[3:])
## 頭から3文字から5文字目まで
print(sample[2:5])
## 頭から3文字飛ばし
print(sample[::3])
## 反対に並びかえる
print(sample[::-1])
まとめ
すこし駆け足でしたが、Pythonを使った文字列操作の基本である、文字列の「分割・抽出・切り出し」を説明しました。また少し高度な内容でしたが、re.splitによる正規表現を利用した文字列抽出についてもPythonのサンプルコードで解説しました。
この記事で抑えた内容を使いこなせれば、文字の分割・抽出・切り出しについて困ることはあまり無いでしょう。とはいえPythonの文字列操作はこれだけではありません。split以外にもたくさんあります。有名なものだとreplace, join, strip, upper, lowerなどがあります。
興味があれば、ぜひトライしてみてください。