Pythonで文字列を分割する方法|split・rsplit・partition・splitlines・re.splitの使い分け
Pythonで文字列を分割するには、区切り文字が決まっていれば s.split(“,”)、空白で区切るなら引数なしの s.split()、最初(または最後)の1か所だけで2つに分けるなら partition() や rsplit(…, 1)、改行で分けるなら splitlines()、複数の区切り文字を使うなら re.split() を使います。
どれも結果はリスト(partition はタプル)で返ります。この記事では、目的別にどのメソッドを選べばよいかを早見表で示し、それぞれの動きと落とし穴を実行結果で確認します。各メソッドをさらに詳しく知りたいときのために、個別の解説記事へのリンクも付けました。コードは Python 3.12.15 で実行し、Python 3.13 以降で変わった点は 3.14.8 で確認しました(2026年10月15日確認)。
目的別の早見表
| やりたいこと | 使うもの | 例 |
|---|---|---|
| 決まった区切り文字で全部分ける | split(sep) | "a,b,c".split(",") |
| 空白(スペース・タブ・改行)で分ける | split()(引数なし) | "a b\tc".split() |
| 先頭から n 回だけ分ける | split(sep, maxsplit=n) | s.split(" ", maxsplit=3) |
| 右(後ろ)から n 回だけ分ける | rsplit(sep, n) | path.rsplit("/", 1) |
| 最初の区切りで3つ(前・区切り・後)に分ける | partition(sep) | "k=v".partition("=") |
| 最後の区切りで3つに分ける | rpartition(sep) | "a.b.pdf".rpartition(".") |
| 改行で行ごとに分ける | splitlines() | text.splitlines() |
| 複数の区切り文字・パターンで分ける | re.split(pattern, s) | re.split(r"[,;]", s) |
| n 文字ずつに分ける | スライス+内包表記 | [s[i:i+n] for i in range(0, len(s), n)] |
| 1文字ずつに分ける | list(s) | list("abc") |
| CSVの1行を分ける | csv モジュール | csv.reader |
split():区切り文字で分割する基本
print("りんご,みかん,ぶどう".split(",")) # 区切り文字を指定
print("1,2,,3,".split(",")) # 連続した区切りや末尾は '' になる
print(" Python Java\tC ".split()) # 引数なし:空白の連続をまとめて区切る
print("".split(","), "".split()) # 空文字列の結果が違う
実行結果:
['りんご', 'みかん', 'ぶどう']
['1', '2', '', '3', '']
['Python', 'Java', 'C']
[''] []
split() は、引数を渡すかどうかで動きが変わります(Python公式ドキュメント str.split)。
- 区切り文字を渡したとき:区切りが連続していても1つずつ数え、間に空文字 ” が入る。末尾が区切りなら最後にも ” が入る
- 引数なし(None)のとき:スペース・タブ・改行の連続をまとめて1つの区切りとみなし、前後の空白も無視する。空の要素はできない
区切りには "<>" のように2文字以上の文字列も使えますが、それは「その並びの文字列」として扱われます。「, か ; のどちらか」のように複数の区切りを指定したいときは、後で説明する re.split() を使います。split() の基本は「Pythonのsplit()とは?」でも解説しています。
分割回数を決める:maxsplit と rsplit()
maxsplit を指定すると、分割は最大その回数までになり、残りは最後の要素にまとめて入ります。rsplit() は同じことを右側から行います。
log = "2026-10-15 12:30:45 ERROR ディスクの空きが不足しています"
date, time, level, message = log.split(" ", maxsplit=3) # 最大3回だけ分割
print(level, "/", message)
path = "photos/2026/10/beach.jpg"
print(path.rsplit("/", 1)) # 右から1回だけ分割
print(path.split("/", 1)) # 左から1回だけ分割
実行結果:
ERROR / ディスクの空きが不足しています
['photos/2026/10', 'beach.jpg']
['photos', '2026/10/beach.jpg']
ログの例では、日付・時刻・レベルの3つを切り出し、空白を含むメッセージ本文は1つのまま残せました。パスの例のように「最後の / より後ろ」を取りたいときは rsplit(…, 1) が便利です。詳しくは「Pythonのmaxsplitとは?」「Pythonのrsplit()とは?」をどうぞ。
partition() と rpartition():1か所で3つに分ける
partition() は、最初に見つかった区切りで文字列を「前・区切り・後」の3つ組(タプル)に分けます。区切りが見つからないときは、(元の文字列, ”, ”) を返します(Python公式ドキュメント str.partition)。
email = "taro@example.com"
print(email.partition("@")) # (前, 区切り, 後) の3つ組
print("no-at-mark".partition("@")) # 区切りが無くても3つ組が返る
filename = "report.final.pdf"
name, dot, ext = filename.rpartition(".") # 最後の . で分ける
print(name, ext)
key, _, value = "timeout=30".partition("=")
print(key, value)
実行結果:
('taro', '@', 'example.com')
('no-at-mark', '', '')
report.final pdf
timeout 30
split() との大きな違いは、結果が必ず3つになることです。a, b = s.split("=") と書くと、= が無い文字列や2つ以上ある文字列で ValueError になりますが、key, _, value = s.partition("=") なら常に3つに分けられます。区切りがあったかどうかは、真ん中の要素が空かどうかで判定できます。
拡張子を取り出すように「最後の区切り」で分けたいときは rpartition() を使います。詳しくは「Pythonのrpartition()とは?」で説明しています。
re.split():複数の区切り文字・パターンで分ける
標準ライブラリの re モジュールの re.split() は、正規表現にマッチした部分で文字列を分けます。
import re
text = "りんご, みかん;ぶどう / もも"
print(re.split(r"\s*[,;/]\s*", text)) # 複数の区切り文字と前後の空白
print(re.split(r"(\d+)", "abc12def345ghi")) # () で囲むと区切りも残る
print(re.split(r"[、。]", "今日は晴れ。明日は雨、明後日は雪。"))
実行結果:
['りんご', 'みかん', 'ぶどう', 'もも']
['abc', '12', 'def', '345', 'ghi']
['今日は晴れ', '明日は雨', '明後日は雪', '']
[,;/]は「, ; / のどれか1文字」、\s*は「0個以上の空白」です。区切りの前後の空白もまとめて取り除けます- パターンを ( ) で囲むと、区切りに使った部分もリストに残ります(Python公式ドキュメント re.split)
- 文末が区切り(。)で終わっていると、最後に ” が入ります。不要なら後で取り除きます
正規表現の書き方は「Python re.split()とは?」で詳しく扱っています。
Python 3.13 以降:re.split の maxsplit はキーワードで渡す
Python 3.13 から、re.split() の maxsplit と flags を位置引数で渡す書き方は非推奨になりました。公式ドキュメントでは、将来のバージョンでキーワード専用の引数になると予告されています。
s = "a,b,c,d"
print(s.split(",", 2)) # str.split は位置引数でもよい
import re, warnings
warnings.simplefilter("always")
print(re.split(",", s, 2)) # 3.13 以降は警告が出る
print(re.split(",", s, maxsplit=2)) # キーワードで渡せば警告なし
Python 3.14.8 での実行結果:
s5.py:6: DeprecationWarning: 'maxsplit' is passed as positional argument
print(re.split(",", s, 2)) # 3.13 以降は警告が出る
['a', 'b', 'c,d']
['a', 'b', 'c,d']
['a', 'b', 'c,d']
Python 3.12.15 では警告は出ませんでした。結果は同じですが、これから書くコードでは re.split(",", s, maxsplit=2) のようにキーワードで渡しておきます。str.split() のほうは、位置引数で渡しても警告は出ません。
改行で分ける:splitlines()
複数行の文字列を行ごとに分けるなら、split(“\n”) ではなく splitlines() を使います。Windows の改行コード \r\n も正しく扱え、末尾の改行で空の要素も増えません。違いの実行例は「Pythonの改行の扱い方」で紹介しています。
文字数で分ける・1文字ずつ分ける
区切り文字ではなく、決まった文字数ごとに分けたいときはスライスを使います。
text = "ABCDEFGHIJ"
n = 4
print( for i in range(0, len(text), n)]) # 4文字ずつ
print(list("こんにちは")) # 1文字ずつ
import textwrap
print(textwrap.wrap("あいうえおかきくけこさしす", 5)) # 標準ライブラリでも可
実行結果:
['ABCD', 'EFGH', 'IJ']
['こ', 'ん', 'に', 'ち', 'は']
['あいうえお', 'かきくけこ', 'さしす']
list() に文字列を渡すと、1文字ずつのリストになります。日本語も1文字ずつに分かれます。
分割した後によくやる処理
row = "田中, 30 ,東京"
print(row.split(",")) # 空白が残る
print([x.strip() for x in row.split(",")]) # 各要素の前後の空白を除く
data = "apple,,banana,,orange"
print([x for x in data.split(",") if x]) # 空の要素を除く
nums = list(map(int, "10 20 30".split())) # 分割して数値に
print(nums, sum(nums))
実行結果:
['田中', ' 30 ', '東京']
['田中', '30', '東京']
['apple', 'banana', 'orange']
[10, 20, 30] 60
- 空白を取り除く:split(“,”) は区切りの前後の空白を残すので、内包表記で strip() する
- 空の要素を除く:
if xで空文字を取り除く - 数値に変換する:split() の結果は文字列のリストなので、map(int, …) で数値にする
CSVの1行は split(“,”) で分けない
値の中にカンマを含むCSVでは、その値がダブルクォートで囲まれています。split(“,”) はクォートを考慮しないので、値が途中で割れてしまいます。
import csv
import io
line = '山田,"東京都千代田区1-2-3, 5F",03-0000-0000'
print(line.split(",")) # カンマを含む値が割れてしまう
print(next(csv.reader(io.StringIO(line)))) # csv モジュールなら正しく分かれる
実行結果:
['山田', '"東京都千代田区1-2-3', ' 5F"', '03-0000-0000']
['山田', '東京都千代田区1-2-3, 5F', '03-0000-0000']
CSVを読むときは、標準ライブラリの csv モジュールや pandas の read_csv() を使います。
よくある質問
Q. split() と split(” “) の違いは何ですか?
split() は空白の連続をまとめて1つの区切りとみなし、前後の空白も無視します。split(” “) は半角スペース1つずつで区切るので、スペースが2つ続くと空の要素 ” ができます。タブや改行でも区切りたいときは split() を使います。
Q. 複数の区切り文字で分割するには?
re モジュールの re.split() を使います。たとえば re.split(r”[,;]”, s) とすると、カンマとセミコロンのどちらでも分割できます。
Q. partition() と split() はどう使い分けますか?
区切りで全部分けたいなら split()、最初の1か所だけで前後に分けたいなら partition() です。partition() は区切りが無くても必ず3つの要素を返すので、変数への代入でエラーになりません。
Q. 後ろから分割するには?
rsplit() を使います。rsplit(“/”, 1) のように回数を指定すると、最後の区切りで2つに分けられます。前後と区切りの3つに分けたいなら rpartition() を使います。
まとめ
- 区切り文字が決まっていれば split(sep)、空白なら引数なしの split()
- 回数を絞るなら maxsplit、後ろからなら rsplit()
- 1か所で前後に分けるなら partition() / rpartition()。必ず3つ組が返る
- 複数の区切りやパターンは re.split()。3.13 以降は maxsplit をキーワードで渡す
- 改行は splitlines()、CSV は csv モジュール
文字列メソッドの全体は「Python 文字列(str)メソッド一覧」にまとめています。
あわせて読みたい
学習の順序はPython学習のロードマップ、標準で使える機能の一覧はPython標準ライブラリのモジュール一覧にまとめています。
アルゴリズムとデータ構造の全体像はアルゴリズムとデータ構造入門完全ガイドにまとめています。



