🐍 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と混同している可能性が高いバグなので、疑ってみてください。

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