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標準ライブラリのモジュール一覧にまとめています。

アルゴリズムとデータ構造の全体像はアルゴリズムとデータ構造入門完全ガイドにまとめています。

プログラミング学習に興味がある方は、まずは無料体験会へ

無料体験会・お申し込みはこちら