文字列の分割は、文字列の解析やデータ処理などで頻繁に行われる作業の一つですね。
Pythonには、文字列を簡単に分割するための機能が豊富に用意されています。
しかし、実際に文字列の分割を行おうとすると、次のような課題に直面することも…。
- 特定の文字でテキストを分割する方法は?
- テキストを行ごとに分割する方法は?
- 正規表現を使って複雑な分割処理を行いたい!
この記事では、Pythonの文字列分割について図解付きでわかりやすく解説していきます。
文字列分割方法まとめ
文字分割の基本の流れは次の通りです。
- 分割したい文字列を準備|
text = "分割したい文字列"
- 分割用のメソッドを実行|
text.分割用メソッド()
分割用のメソッドには、区切り文字で分割するものや、改行で分割するものなどがあります。
これらの方法に加えて、正規表現のre
モジュールを使用した分割方法もあります。
Pythonにおける主な文字列分割方法を以下の表にまとめているので、一覧を確認してみましょう。
メソッド名・方法名 | 説明 |
---|---|
split() |
指定した区切り文字で文字列を分割。 → 分割された文字列を [リスト] で返す。※デフォルトでは空白文字が区切り文字 |
rsplit() |
split() と同様だが、文字列を右端から分割。分割回数を指定した際に split() と挙動の違いがでる。 |
splitlines() |
改行文字を区切り文字として、文字列を複数の行に分割。 → 複数行のテキストを行ごとに分割するときに便利 |
partition() |
指定した区切り文字を境に文字列を前後に分割。 → 区切り文字を含めた3つの文字列を (タプル) で返す。 |
rpartition() |
partition() と同様だが、文字列を右端から分割。 |
正規表現で分割 | re モジュールのsplit() を使うと正規表現を指定して文字列を分割できる。 |
split()
とsplitlines()
は、最も基本的な文字列分割メソッドです。
正規表現を使えば、柔軟に分割処理ができるので、こちらも抑えておきたい技術の一つですね。
以下では、これらの文字列分割方法について、サンプルコード付きで詳しく解説していきます。
区切り文字で分割|split()
最も基本的な文字列の分割方法です。基本挙動は次の通りです。
- 指定した区切り文字で文字列を分割
- デフォルト:空白文字(スペース、タブ
\t
、改行\n
,\r\n
)で分割
- デフォルト:空白文字(スペース、タブ
- 分割結果を
[リスト]
で返す
まずは簡単な文字列で実行例を確認してみましょう。
# デフォルト設定(空白文字)で分割
text = "ABC DEF\tGEH\nIJK" # \t:タブ, \n:改行
text.split()
# ['ABC', 'DEF', 'GEH', 'IJK']
# 区切り文字を指定して分割
text = "ABC, DEF, GEH, IJK"
text.split(",")
# ['ABC', ' DEF', ' GEH', ' IJK']
簡単に文字列が分割できましたね。
結果はリストで返されるので、必要な要素を抽出するなどして使用していきましょう。
分割回数の指定
デフォルトでは、文字列内にある全ての区切り文字で分割が行われます。
引数maxsplit
で、区切り文字で何回まで分割するかを指定することができます。
maxsplit = 最大の分割回数
指定した回数以上は分割されなくなります。1回だけ分割したいときに便利ですね。
text = "ABC DEF GEH IJK"
text.split(maxsplit=1)
# ['ABC', 'DEF GEH IJK']
text.split(maxsplit=2)
# ['ABC', 'DEF', 'GEH IJK']
rsplit()で右側から分割
split()
の派生形として、rsplit()
があります。
これは、文字列の右側から文字列の分割を行うメソッドです。
回数を指定せずに文字列を分割するだけの場合は、split()
とrsplit()
で違いはありません。
分割回数を指定すると、split()
とrsplit()
で挙動の違いが出ます。
text = "ABC DEF GEH IJK"
text.split(maxsplit=1)
# ['ABC', 'DEF GEH IJK']
text.rsplit(maxsplit=1)
# ['ABC DEF GEH', 'IJK']
次のように使い分けをするといいですね。
- 左側から
n
回分割したいとき:split(maxsplit=n)
- 右側から
n
回分割したいとき:rsplit(maxsplit=n)
maxsplit
を指定しないと、全ての区切り文字で分割されるので、両者で同じ結果になってしまいます。
行ごとに分割|splitlines()
複数行のテキストを行ごとに分割する場合は、splitlines()
を使うと便利です。
splitlines()
⇒ 文字列を改行文字('\n'
または'\r\n'
)で分割
デフォルトでは、分割後に改行文字は残りません。
text = """一行目の文章です。
二行目です。
三行目。"""
# 改行文字を表示すると次のような状態
# '一行目の文章です。\n二行目です。\n三行目。'
# splitlines()で分割
text.splitlines()
# ['一行目の文章です。', '二行目です。', '三行目。']
改行文字を残しておきたい場合には、引数keepends=True
を指定します。
text = """一行目の文章です。
二行目です。
三行目。"""
# splitlines()で分割(デフォルトでは改行文字は残らない)
text.splitlines()
# ['一行目の文章です。', '二行目です。', '三行目。']
# keepends=Trueで改行文字を残す
text.splitlines(keepends=True)
# ['一行目の文章です。\n', '二行目です。\n', '三行目。']
改行文字が分割後のテキスト内に残っていますね。
splitlines()
は、テキストファイルの読み込み後に使用することが多いですね。
テキストファイルの読み込みについては、次の記事を参考にしてください
partition()メソッドでの分割
partition()
メソッドは、指定した区切り文字で文字列を前後に分割して、区切り文字を含めた分割結果を返します。
text.partition("区切り文字")
→("分割結果1", "区切り文字", "分割結果2")
区切り文字を含めて、文字列を別途処理する必要がある場合に使うと便利です。
text = "12345X54321"
text.partition("X")
# ('12345', 'X', '54321')
分割回数を指定することはできず、初めに出現した区切り文字で分割されます。
text = "12345X54321"
text.partition("5")
# ('1234', '5', 'X54321')
rpartition()
を使用すると、右側から分割することができます。
text = "12345X54321"
text.rpartition("5")
# ('12345X', '5', '4321')
正規表現で分割|reモジュール
Pythonの正規表現モジュールre
を使用すると、正規表現で区切り文字を指定できます。
正規表現は慣れるまではとっつきにくいですが、使えるようになると文字列操作がぐっと楽になります。
re.split("区切り文字の正規表現", "分割する文字列")
正規表現のパターンの作成方法、正規表現を使用した文字列の検索方法については次の記事で解説しています。
以下では、分割で特に便利な正規表現に絞って紹介します(詳しくは、上の記事を見てください)。
分割で便利な正規表現
文字列の分割のために覚えておくと便利な正規表現を紹介します。
分割方法 | 説明 |
---|---|
複数の区切り文字を指定 | | を使用して複数の文字を区切り文字に指定 *例: "aaa\|bbb" → aaa またはbbb で分割される。 |
数値 or 数値以外で分割 | \d+ : → 1個以上の数値で分割 \D+ : → 1個以上の数値以外で分割 |
空白文字で分割 | \s+ → 1個以上の空白文字で分割*空白文字:スペース、タブ、改行など " \t\n\r\f\v" |
import re
text = "1999年1月2日"
# |を使用して、複数の文字列を区切り文字に指定
re.split("年|月|日", text)
# ['1999', '1', '2', '']
# 数値で分割
re.split("\d+", text)
# ['', '年', '月', '日']
# 数値以外で分割
re.split("\D+", text)
# ['1999', '1', '2', '']
正規表現が使えれば、いろいろな文字列分割ができますね。
オススメ|データ分析の勉強方法
今回はPythonでテキストファイルを分割する方法ついて解説しました。
データ分析初心者の方にはこちらの記事もおススメです。
Pythonで作業の効率化を目指している方には、次の記事がおススメです。