【完全ガイド】Pythonの re.split() の使い方まとめ!正規表現で文字列を自由に分割する方法を徹底解説

  • 2020.10.21
  • (更新日:2025.11.27)
  • python
【完全ガイド】Pythonの re.split() の使い方まとめ!正規表現で文字列を自由に分割する方法を徹底解説

Pythonで文字列を分割するとき、つい str.split() を使いがちですよね。
でも、実際のデータ処理やログ解析では「カンマとスペースが混ざってる」「数字と文字の境目で分けたい」など、もう少し柔軟に分割したい場面がよくあります。

そんなときに役立つのが、正規表現を使って文字列を分割できる re.split() です。
複雑なデータでもシンプルなコードで処理できるので、知っておくと一気に作業効率が上がります。

この記事では、re.split() の基本の使い方から、複数の区切り文字・区切り文字を残す方法・実務でよく使うパターンまで、初心者にも分かりやすく丁寧にまとめました。実際に動くコード付きなので、今日からそのまま真似できます。

目次

Pythonの re.split() とは?

str.split() との違い

str.split() は「特定の1つの文字列」で区切るときに便利ですが、複雑なパターンには弱いんですよね。
例えば1〜9のどれであっても数値があれば区切り文字にしたくてもできません。
参考:Python:splitで文字列を簡単に分割

そこで登場するのが re.split() です。
これは正規表現で区切り文字を指定できるので「複数の記号でまとめて分割したい」「数字と文字の境目で分けたい」といったケースに強いです。
たとえばこんな感じ:

import re
print(re.split(r'[,;]', "a,b;c"))
# => ['a', 'b', 'c']

re.split関数を使う際には、reをimport文でインポートします。
(参考:Python:importの使い方(from,asやルールについて))

re.split() が必要になるケース

ログ解析やテキスト整形のように、区切り文字が毎回バラバラな場合は str.split() では太刀打ちできません。
たとえば「カンマ、タブ、スペースが混ざったCSV」や「記号と数字が入り交じるログ」などです。
そんなとき re.split() は1つの正規表現で一気に分割できるので、前処理のストレスがぐっと減ります。

import re
print(re.split(r'[, \t]+', "a, b   c\t d"))
# => ['a', 'b', 'c', 'd']

正規 表現を使うメリット

正規表現のメリットは「条件を文章のように書ける」ことです。
たとえば「数字が続くところで分割したい」「記号が1つ以上続いたらそこで切りたい」といった柔軟なルールを1行で表現できます。
これにより、分割ロジックを追加したくなってもコードが複雑化しません。
慣れないうちは怖いですが、パズル感覚で慣れると強力です。

import re
print(re.split(r'\d+', "abc123def456ghi"))
# => ['abc', 'def', 'ghi']

re.split() の基本的な使い方

基本構文と引数の解説

re.split(pattern, string, maxsplit=0, flags=0) が基本形です。
pattern は正規表現、string が分割する文字列。maxsplit には「最大何回まで分割するか」を指定できます。
flags は大文字小文字を無視するなどのオプション。
まずは pattern の書き方さえ押さえれば OK です。

import re
re.split(r'パターン', '文字列', maxsplit=2)

最も簡単なサンプルコード

まずはシンプルな例を見ましょう。
カンマで区切るだけなら str.split() でいいですが、あえて re.split() を使うと違いがわかりやすいです。
特に区切り文字が複雑になる場合に備えて、最小限の形を覚えておくと後が楽です。

import re
text = "apple,banana,orange"
print(re.split(r',', text))
# => ['apple', 'banana', 'orange']

複数の区切り文字で文字列を分割する方法

re.split() の真価はここです。
たとえば「カンマ・セミコロン・スペースを全部区切り文字にしたい」とき、普通にやると処理が面倒ですよね。
でも正規表現を使えば1行でスッキリ書けます。
区切り文字が増えても書き換えが簡単なので、データ加工のときにめちゃくちゃ重宝します。

import re
text = "a,b; c  d"
print(re.split(r'[;, ]+', text))
# => ['a', 'b', 'c', 'd']

実用的な re.split() の使い方(正規 表現の活用)

数字・アルファベット・記号をまとめて区切る

テキストの中で「数字と文字の境目で区切りたい」というケース、意外と多いんですよね。
re.split() なら「数字が連続している部分」を区切りに使うことができます。
ログ解析や商品コードの処理でよく使うテクニックです。

import re
print(re.split(r'[\d]+', "item123price456tag"))
# => ['item', 'price', 'tag']

1つの数字を正規表現で文字列を分割する場合には、「\d」を使います。
「\d」で0~9の数字のどれかを表します。
連続した数字の場合は、区切り文字で指定した「\d+」は、「\d」と「+」を付け足して「\d+」とすると1文字以上の連続した数字を表すことが出来ます。
アルファベットの正規表現で文字列を分割する場合、大文字の場合は[A-Z]を記述し・小文字の場合は[a-z]を記述します。
ちなみにひらがなを区切り文字にしたい場合は、[あ-ん]を記述し、カタカナは [ア-ヴ]を指定すれば区切り位置となります。

特にスクレイピングにおいては使いこなすことが出来ると、どんなデータでも上手に取得する事が出来ますので是非覚えましょう。
(参考:Python:webスクレイピングの基礎)

スペースやタブなどの空白類をまとめて処理する

テキスト処理で厄介なのが「スペースの数がバラバラ」なケース。
re.split(r'\s+') を使うと、スペース・タブ・改行をまとめて1つの区切りとして扱えます。
前処理が一気に楽になるので覚えて損なしのパターンです。

import re
print(re.split(r'\s+', "a   b\tc\nd"))
# => ['a', 'b', 'c', 'd']

複雑なフォーマットのログ・CSV を分割する例

ログファイルや実際のCSVは、きれいに1つの記号で区切られていることのほうが珍しいです。
記号が混ざっていたり、ステータスが数字と文字で入り混じっていたり。
この場合、正規表現で「分割条件」を書くほうが実用的です。

import re
line = "INFO:2024/11/01-12:30 user=alice id=42"
print(re.split(r'[:=\s/-]+', line))
# => ['INFO', '2024', '11', '01', '12', '30', 'user', 'alice', 'id', '42']

re.split() で「区切り文字を残す」方法

キャプチャグループを使って区切り文字を残すテクニック

re.split() では、分割したい区切り文字を「()」で囲むと、その文字も結果に残せます。
たとえば文章から句読点を保持したまま分割したいケース。
これは NLP 系の前処理でよく使います。キャプチャするだけでOKなので簡単。

import re
text = "Hello, world! Pythonは楽しい。"
print(re.split(r'([,.!。])', text))
# => ['Hello', ',', ' world', '!', ' Pythonは楽しい', '。', '']

後読み・先読みの正規 表現を使った方法

見た目上は区切りたいけど、結果には残したい — そんなときは「先読み・後読み」を使います。
例えば「句点の直後で区切るけど句点は残したい」なら後読み (?<=。) が使えます。
テキスト分割を自然に行いたいときに便利。

import re
print(re.split(r'(?<=。)', "今日は晴れ。明日も晴れ。"))
# => ['今日は晴れ。', '明日も晴れ。', '']

残したい文字と不要な文字を使い分ける実例

区切り文字の一部だけ残したいケースもあります。
たとえば「= は残すけど空白は残したくない」など。
キャプチャする部分としない部分を分離して書くと制御できます。
分割後の加工が大幅に減るので覚えておくと楽。

import re
text = "key = value"
print(re.split(r'\s*(=)\s*', text))
# => ['key', '=', 'value']

よくあるエラーとハマりどころ

区切り文字が正規 表現として解釈されてしまう問題

.+ などは正規表現では特別な意味を持つため、そのまま re.split() に渡すと意図しない分割になります。
リテラル文字として扱いたい場合は re.escape() を使うと安全です。これを知らないとかなりハマります。

import re
print(re.split(re.escape("."), "a.b.c"))
# => ['a', 'b', 'c']

空文字列が返る場合の原因

分割した結果に空文字列が混ざるのは、区切り文字が連続したり、文字列の先頭・末尾に区切り文字があるケースです。
不要ならフィルタで取り除くか、正規表現に「+」を付けて連続をまとめて扱うと解決します。

import re
print(re.split(r',+', ",a,,b,"))
# => ['', 'a', 'b', '']

意図しない位置で分割される場合の対処法

パターンを広く書きすぎていると、思わぬ場所で区切られてしまいます。
デバッグには re.findall() を使って「実際どこがマッチしているか」を確認するのが最速。
複雑なログなどでは特に有効です。

import re
print(re.findall(r'[a-z]+', "abc123def"))
# => ['abc', 'def']

re.split() を使った実践サンプル集

メールアドレスやURLを分割する

メールアドレスやURLは記号が複雑なので、正規表現で分割すると処理しやすくなります。
例えばドメイン部分だけ抽出したいとき、@/ を区切りにして分割すればOK。構造理解にも役立ちます。

import re
print(re.split(r'[@/]', "user@example.com/path"))
# => ['user', 'example.com', 'path']

文章を文単位・句単位で分割する

文章処理では「。」「?」「!」周りで分割することが多いです。
キャプチャを併用すれば句読点を保持できます。
自然言語処理の前処理としてよく使うパターン。

import re
text = "今日は晴れ。明日は雨?でも週末は晴れる!"
print(re.split(r'([。?!])', text))
# => ['今日は晴れ', '。', '明日は雨', '?', 'でも週末は晴れる', '!', '']

データクレンジングに使うサンプル

ログやCSVは区切り文字が混在するので re.split() 向きです。
たとえば「空白+記号+数字」が混じった値を一気に分解できます。
データ分析の前工程でかなり重宝します。

import re
line = "a=10  b=20 ; c=30"
print(re.split(r'[=;\s]+', line))
# => ['a', '10', 'b', '20', 'c', '30']

re.split() と組み合わせて覚えたい正規 表現テクニック

re.findall() と併用してデータを抽出する方法

re.split() は分割、re.findall() は抽出。目的が違うので組み合わせると強力です。
分割した結果の中に必要な値だけを抽出するときに便利です。

import re
text = "id=42 name=alice score=98"
parts = re.split(r'\s+', text)
nums = re.findall(r'\d+', text)
print(parts, nums)
# => ['id=42', 'name=alice', 'score=98'] ['42', '98']

re.sub() で置換までまとめて行うワークフロー

「区切る → 整形する → 出力する」まで一気にやりたいときは re.sub() とセットで使います。
たとえば不要な記号を削ってから分割する、という流れを作るとコードがスッキリします。

import re
text = "ab--c"
clean = re.sub(r'-+', '-', text)
print(re.split(r'-', clean))
# => ['ab', 'c']

業務で実際によく使うパターン一覧(チートシート)

よく使うパターンは以下の3つです。

  • \s+:空白類
  • [,:;]:複数の記号
  • (?<=。):句点の後で分割
    このセットさえ覚えておけば業務の8割は対応できます。あとは都度追加するだけでOK。
import re
re.split(r'\s+|[,;]', "a, b;   c")
# => ['a', '', 'b', '', 'c']

re.split() のパフォーマンスと注意点

大量データを扱うときの高速化のコツ

巨大ファイルを処理するなら、毎回 re.split() を呼ぶよりも「1行ずつ処理する」「ジェネレータを使う」などの工夫が必要です。
特にログ解析では行単位で動かすほうが圧倒的に速いです。

import re
pattern = re.compile(r'\s+')
for line in open("log.txt"):
    parts = pattern.split(line)

正規 表現コンパイル(re.compile)で速度改善

繰り返し分割するなら必ず re.compile() を使いましょう。
コンパイル済み正規表現は速度が段違いです。
ループ内で何千回も呼ばれる処理では必須テクニックです。

import re
p = re.compile(r'[,; ]+')
print(p.split("a,b; c d"))

読みやすいコードを書くためのベストプラクティス

正規表現はどうしても読みにくくなるので、なるべく「意味のある変数名を付ける」「コメントを書く」「コンパイルして再利用する」の3つを守るとチーム開発で嫌われません。

import re
# カンマ/セミコロン/空白で分割
splitter = re.compile(r'[;, ]+')
splitter.split("a,b; c")

まとめ:Pythonの re.split() を使いこなして文字列処理を最適化しよう

使い方の総復習

re.split() は「正規表現で柔軟に分割できる」強力な関数です。
単純な区切りなら str.split()、複雑なパターンなら re.split() と使い分ければ、文字列処理が一気に楽になります。
特にログ処理やデータ前処理で威力を発揮します。

正規 表現の学習を進めるための次のステップ

次は re.findall()re.sub()re.compile() の3つを押さえると、テキスト処理の自由度が一気に上がります。
少しずつ使いながら覚えるのが一番の近道です。
まずは簡単な例から触れるのがおすすめ。

初心者が最初に押さえるべきポイント

難しく考えすぎず「必要なときに調べる」でOKです。
特に以下の3つだけ覚えておけば十分:

  • 複数の区切り → [;, ]+
  • 区切りを残す → ()
  • 空白まとめて → \s+

小さな成功体験を積むと、正規表現の世界が一気に開けてきます。

pythonカテゴリの最新記事