Pythonのre.sub()とは?正規表現で文字列を置換する方法を初心者向けに解説

Pythonで文字列を検索して置換するとき、単純な文字列の置換ならreplace()が便利です。しかし、「数字だけを置換したい」「複数の空白を1つにまとめたい」「特定のパターンに一致する文字列をまとめて置換したい」といった処理では、正規表現を使えるre.sub()が役立ちます。
この記事では、Pythonのre.sub()について、基本的な使い方から引数、正規表現を使った実例、replace()との違いまで初心者向けに解説します。
re.sub()とは?
re.sub()は、Pythonのreモジュールに用意されている関数で、正規表現に一致した文字列を別の文字列に置換するために使います。
基本的な書き方は次のとおりです。
import re
結果 = re.sub(パターン, 置換後, 文字列)
例えば、文字列中の数字を*に置き換える場合は次のように書きます。
import re
text = "Python123"
result = re.sub(r"\d", "*", text)
print(result)
実行結果:
Python***
r"\d"は「数字」を表す正規表現です。
つまり、
re.sub(r"\d", "*", text)
は「文字列の中にある数字を*に置換する」という意味になります。
re.sub()の基本構文
re.sub()の基本構文は次のとおりです。
re.sub(pattern, repl, string, count=0, flags=0)
それぞれの意味は次のとおりです。
| 引数 | 意味 |
|---|---|
pattern |
置換対象を指定する正規表現 |
repl |
置換後の文字列または関数 |
string |
置換する対象の文字列 |
count |
最大置換回数 |
flags |
正規表現のオプション |
countを省略するか0にすると、条件に一致する箇所をすべて置換します。replには文字列だけでなく関数も指定できます。(Python documentation)
re.sub()の基本的な使い方
文字列を置換する
まずは最も基本的な例です。
import re
text = "Python is easy. Python is useful."
result = re.sub("Python", "Java", text)
print(result)
実行結果:
Java is easy. Java is useful.
Pythonに一致する部分がすべてJavaに置換されています。
数字を置換する
正規表現を使うと、数字だけを対象にできます。
import re
text = "商品A 100円、商品B 200円"
result = re.sub(r"\d+", "金額", text)
print(result)
実行結果:
商品A 金額円、商品B 金額円
\d+は「1個以上連続する数字」を意味します。
そのため、
100
や
200
がそれぞれ置換されます。
re.sub()で空白を削除する
複数の空白をまとめて削除することもできます。
import re
text = "Python programming"
result = re.sub(r"\s+", "", text)
print(result)
実行結果:
Pythonprogramming
\sは空白文字などを表します。
+を付けることで、「1個以上連続する空白」を対象にしています。
例えば、
Python programming
の4つの空白をまとめて置換できます。
複数の空白を1つにする
空白を完全に削除するのではなく、複数の空白を1つにまとめることもできます。
import re
text = "Python programming"
result = re.sub(r"\s+", " ", text)
print(result)
実行結果:
Python programming
この方法は、ユーザーが入力した文章の余分な空白を整理するときなどに便利です。
re.sub()で改行を削除する
改行を削除することもできます。
import re
text = "Python\nJava\nRuby"
result = re.sub(r"\n", "", text)
print(result)
実行結果:
PythonJavaRuby
改行をスペースに変換したい場合は次のようにします。
result = re.sub(r"\n", " ", text)
実行結果:
Python Java Ruby
re.sub()で電話番号を置換する
正規表現を使うと、電話番号のような一定の形式を持つ文字列も置換できます。
import re
text = "電話番号は090-1234-5678です。"
result = re.sub(r"\d{3}-\d{4}-\d{4}", "非公開", text)
print(result)
実行結果:
電話番号は非公開です。
ここでは、
\d{3}
で3桁の数字、
\d{4}
で4桁の数字を表しています。
そのため、
090-1234-5678
という形式に一致します。
re.sub()でメールアドレスを置換する
メールアドレスのようなパターンを置換することもできます。
import re
text = "連絡先: test@example.com"
result = re.sub(
r"[\w.-]+@[\w.-]+\.\w+",
"[メールアドレス]",
text
)
print(result)
実行結果:
連絡先: [メールアドレス]
個人情報を含む文章を加工するときなどに利用できます。
re.sub()のcountで置換回数を指定する
countを指定すると、置換する回数を制限できます。
import re
text = "Python Python Python"
result = re.sub("Python", "Ruby", text, count=1)
print(result)
実行結果:
Ruby Python Python
count=1なので、最初に一致した1箇所だけが置換されます。
一方、
result = re.sub("Python", "Ruby", text)
とすると、すべてのPythonが置換されます。
re.sub()で後方参照を使う
re.sub()では、正規表現のグループを置換後の文字列で利用できます。
例えば、日付を
2026-09-14
から
2026/09/14
に変更してみます。
import re
text = "2026-09-14"
result = re.sub(
r"(\d{4})-(\d{2})-(\d{2})",
r"/\2/\3",
text
)
print(result)
実行結果:
2026/09/14
()で囲んだ部分がグループになります。
r"(\d{4})-(\d{2})-(\d{2})"
では、
-
\1→ 年 -
\2→ 月 -
\3→ 日
として利用できます。
Pythonでは、より明確にするために\g<1>のような書き方もできます。(Python documentation)
result = re.sub(
r"(\d{4})-(\d{2})-(\d{2})",
r"\g<1>/\g<2>/\g<3>",
text
)
re.sub()で関数を使って置換する
re.sub()のreplには関数を指定することもできます。
例えば、数字を2倍した値に置換する例です。
import re
text = "10 20 30"
def double(match):
return str(int(match.group()) * 2)
result = re.sub(r"\d+", double, text)
print(result)
実行結果:
20 40 60
関数には一致した部分を表すMatchオブジェクトが渡されます。
match.group()
で、一致した文字列を取得できます。
このように、単純な文字列置換ではなく、一致した内容を加工してから置換したい場合に関数を使います。(Python documentation)
re.sub()とreplace()の違い
Pythonには、文字列を置換するreplace()もあります。
replace()の場合
text = "Python Python"
result = text.replace("Python", "Ruby")
print(result)
実行結果:
Ruby Ruby
re.sub()の場合
import re
text = "Python123 Python456"
result = re.sub(r"Python\d+", "Ruby", text)
print(result)
実行結果:
Ruby Ruby
大きな違いは、replace()は基本的に文字列そのものを置換するのに対して、re.sub()は正規表現によるパターン指定ができることです。
| 方法 | 特徴 |
|---|---|
replace() |
単純な文字列置換に向いている |
re.sub() |
パターンを指定した置換に向いている |
「Python」という文字を「Ruby」に変えるだけならreplace()で十分です。
一方、
数字だけ
メールアドレスだけ
複数の空白
電話番号形式
特定の文字パターン
などを対象にする場合はre.sub()が便利です。
re.sub()を使うときの注意点
reモジュールをimportする
re.sub()を使うには、最初にreモジュールを読み込みます。
import re
そのうえで、
re.sub(...)
と記述します。
raw文字列を使う
正規表現ではバックスラッシュを多く使うため、パターンを書くときはraw文字列を使うのが一般的です。
r"\d+"
例えば、
re.sub(r"\d+", "*", text)
のように書きます。
countの意味を確認する
countを指定しない場合、条件に一致する箇所をすべて置換します。
re.sub("Python", "Ruby", text)
一部だけ置換したい場合は、
re.sub("Python", "Ruby", text, count=1)
のようにします。
re.sub()とre.subn()の違い
re.sub()に似た関数としてre.subn()があります。
re.subn(pattern, repl, string)
re.sub()が置換後の文字列だけを返すのに対して、re.subn()は置換後の文字列と置換回数をタプルで返します。(Python documentation)
import re
text = "Python Python Python"
result = re.subn("Python", "Ruby", text)
print(result)
実行結果:
('Ruby Ruby Ruby', 3)
置換した回数も確認したい場合にはre.subn()が便利です。
re.sub()のまとめ
Pythonのre.sub()は、正規表現に一致した文字列を別の文字列に置換するための関数です。
基本的な書き方は、
import re
re.sub(pattern, repl, string)
です。
特に覚えておきたいポイントは次のとおりです。
-
re.sub()は正規表現による置換に使う -
patternに置換対象のパターンを指定する -
replに置換後の文字列を指定する -
countで最大置換回数を指定できる -
replには関数も指定できる -
正規表現のグループを使って後方参照できる
-
単純な文字列置換なら
replace()のほうが簡単 -
複雑なパターンの置換には
re.sub()が便利
特に、
re.sub(r"\d+", "*", text)
のような書き方を覚えておくと、「数字だけ置換する」「余分な空白を整理する」「特定の形式の文字列をマスキングする」といった処理に応用できます。
なお、Python公式ドキュメントではre.sub()のcountやflagsを位置引数で渡す方法について、Python 3.13から非推奨となっており、将来的にはキーワード引数が必要になる予定です。(Python documentation)




