🐍 Python

re.sub(pattern, repl, string, count=0, flags=0)

パターンに一致する部分を指定した文字列に置換する関数です。str.replace()が固定の文字列同士の置換しかできないのに対し、re.subはパターンに一致する箇所ならまとめて置換できるため、表記ゆれの統一やマスキング処理でよく使われます。

構文: re.sub(pattern, repl, string, count=0, flags=0)
戻り値: 置換後の新しい文字列

基本の使い方:一致箇所をまとめて置換する

パターンに一致した箇所をすべて指定の文字列に置き換えます。

import re

print(re.sub(r'\d+', '#', 'a1b22c333'))  # 'a#b#c#'

countで置換件数を制限する

count引数に数値を指定すると、先頭から数えてその件数だけ置換し、残りはそのままにします。省略時(0)は全件置換です。

import re

print(re.sub(r'\d+', '#', 'a1b22c333', count=1))
# 'a#b22c333'(先頭の一致1件だけ置換され、残りはそのまま)

後方参照でグループの順番を入れ替える

置換後の文字列の中で\1や\2と書くと、一致したパターン側のグループの値をそのまま使えます。これを使うと、抜き出した値の順序を入れ替えるような置換もできます。

import re

print(re.sub(r'(\w+)@(\w+)', r'\2@\1', 'user@host'))
# 'host@user'(ユーザー名とホスト名の順序を入れ替え)

関数を使って動的に置換する

置換先(repl)には固定文字列だけでなく、関数を渡すこともできます。関数はMatchオブジェクトを受け取り、その戻り値が置換後の文字列として使われます。一致した値を加工してから置換したい場合に使います。

import re

# 一致した数値を2倍にしてから置換する
print(re.sub(r'\d+', lambda m: str(int(m.group()) * 2), 'a1b2c3'))
# 'a2b4c6'
パラメータ
pattern
検索する正規表現パターン(文字列)。raw文字列r'...'で書くのが基本
repl
置換後の文字列、または一致箇所ごとに呼ばれる関数(Matchオブジェクトを受け取り文字列を返す)
string
置換対象の文字列
count(省略可)
置換する最大件数。0(既定)なら全件置換
flags(省略可)
動作オプション。詳しくはflagsのページを参照
💡 置換件数も知りたいならsubn

re.subは置換後の文字列だけを返し、実際に何件置換されたかは分かりません。「何件マスキングしたかをログに残したい」のように件数も同時に必要な場合はre.subnを使うと、置換後の文字列と件数のタプルがまとめて得られます。

← Python re モジュール リファレンス一覧へ戻る