🐍 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を使うと、置換後の文字列と件数のタプルがまとめて得られます。