🐍 Python
re.subn(pattern, repl, string, count=0, flags=0)
re.subと全く同じ置換処理を行いますが、戻り値が「置換後の文字列」だけでなく「置換後の文字列と置換件数のタプル」になります。名前の"n"は件数(number)を表しており、「何件置換されたか」を後続の処理で使いたいときにre.subの代わりに使います。
構文: re.subn(pattern, repl, string, count=0, flags=0)
戻り値: (置換後の文字列, 置換件数) のタプル
基本の使い方:置換後の文字列と件数を同時に受け取る
タプルなので、2つの変数に同時に代入(アンパック)できます。
import re
result, count = re.subn(r'\d+', '#', 'a1b22c333')
print(result) # 'a#b#c#'
print(count) # 3(置換された件数)
件数を条件分岐に使う
置換が実際に行われたかどうかを、戻り値の件数で判定できます。件数が0であれば「対象が見つからなかった」ということが分かります。
import re
result, n = re.subn(r'foo', 'bar', 'foo foo foo', count=2)
print(result, n) # bar bar foo 2
if n == 0:
print('置換対象が見つかりませんでした')
else:
print(f'{n}件を置換しました')
# 2件を置換しました
置換0件を検出する
対象パターンが文字列に含まれていない場合、置換後の文字列は元の文字列のまま、件数は0になります。「一致するはずなのに置換されていない」というバグ調査で、この件数を確認するのが手がかりになります。
import re
result, n = re.subn(r'\d+', '#', 'no digits here')
print(result, n) # no digits here 0
パラメータ
- pattern / repl / string / count / flags
- re.subと全く同じ意味・使い方です
💡 subとsubnの使い分け
置換件数を使わないのであればre.subで十分ですが、「何件処理したかをログに出したい」「1件も一致しなかった場合だけ警告を出したい」といった場面ではre.subnが便利です。AIが生成したコードでre.subの戻り値をタプルとして受け取ろうとしていたら、それはsubnと混同している可能性が高いバグなので、疑ってみてください。