正規表現にマッチした文字列を新しい文字列に置換する(Pattern.sub, Pattern.subn)

Pattern クラスの sub メソッドは、対象の文字列の中で正規表現パターンにマッチした文字列を新しい文字列に置換します。 sub メソッドは置換後の新しい文字列を返しますが、 subn メソッドはタプルとして返します。ここでは Python の正規表現で sub メソッドおよび subn メソッドを使って正規表現にマッチした文字列を新しい文字列に置換する方法について解説します。

(Last modified: )

subメソッドの書式と使い方

Pattern クラスの sub メソッドは、対象の文字列の中で正規表現パターンにマッチした部分文字列を新しい文字列に置換し、置換後の文字列を返します。書式は次の通りです。

Pattern.sub(repl, string, count=0)

Pattern クラスの subn メソッドは、 sub メソッドと同じ動作をしますが、置換後に文字列を返すのではなく新しい文字列と置換した回数の 2 つの要素が含まれるタプルを返します。書式は次の通りです。

Pattern.subn(repl, string, count=0)

どちらのメソッドも 1 番目の引数に置き換える新しい文字列を指定し、 2 番目の引数に対象の文字列を指定します。省略可能な 3 番目の引数には最大置換回数を指定します。デフォルトの値は 0 で、この場合は置換回数に制限がありません。

最初に sub メソッドについてです。次のサンプルを見てください。

import re

msg = 'Border is Red, Box is red, Line is RED'
pattern = re.compile(r'Red|RED')

result = pattern.sub('red', msg)
print(result)

>> Border is red, Box is red, Line is red

正規表現パターンとして「Red」か「RED」のどちらかにマッチするパターンを指定し、このパターンにマッチする文字列を「red」に置換しました。戻り値として置換が終わったあとの新しい文字列を取得しています。

次に subn メソッドについてです。次のサンプルを見てください。

import re

msg = 'Border is Red, Box is red, Line is RED'
pattern = re.compile(r'Red|RED')

result = pattern.subn('red', msg)
print(result)

>> ('Border is red, Box is red, Line is red', 2)

正規表現パターンとして「Red」か「RED」のどちらかにマッチするパターンを指定し、このパターンにマッチする文字列を「red」に置換しました。戻り値として置換が終わったあとの新しい文字列と置換が行われた回数の 2 がそれぞれ要素として格納されたタプルを取得しています。

置換回数を指定する

sub メソッド(および subn メソッド)の 2 番目の引数に最大置換回数を指定することができます。例えば 2 を指定した場合は対象の文字列を最大で 2 回置換します。

次のサンプルを見てください。

import re

msg = 'Red Blue Yellow Pink Green White'
pattern = re.compile(r'\b[a-zA-Z]+?\b')

result = pattern.sub('***', msg)
print(result)

>> *** *** *** *** *** ***

このサンプルでは単語をすべて *** に置換しています。置換回数を制限していないのですべての単語が置換されました。

次に先ほどのサンプルで最大置換回数に 2 を設定してみます。

import re

msg = 'Red Blue Yellow Pink Green White'
pattern = re.compile(r'\b[a-zA-Z]+?\b')

result = pattern.sub('***', msg, 2)
print(result)

>> *** *** Yellow Pink Green White

今回は置換する回数が最大で 2 となっているため、最初の 2 つの単語だけ置換されて残りの単語はそのままとなっています。このように最大置換回数を設定することで、置換する最大数を制限することができます。

キャプチャグループにマッチした文字列を参照する

sub メソッド(および sub2 メソッド)では正規表現の中でキャプチャグループが含まれている場合は、置換する文字列の中で \1, \2, ... を使用することでキャプチャグループでキャプチャされた文字列を参照することができます。

\1, \2, ...  キャプチャグループでキャプチャされた文字列

次のサンプルを見てください。

import re

msg = '次の会議は 2020-12-03 です'
pattern = re.compile(r'(\d{4})-(\d{2})-(\d{2})')

result = pattern.sub(r'\1年\2月\3日', msg)
print(result)

>> 次の会議は 2020年12月03日 です

今回のサンプルでは正規表現パターンに 3 つのキャプチャグループが含まれます。新しい文字列の中で \1 \2 \3 を使ってキャプチャグループでキャプチャした文字列を参照し置換する新しい文字列を指定しています。

また名前付きキャプチャグループを使用している場合は、 \1 や \2 ではなく \g<name> の形式で参照することもできます。次のサンプルを見てください。

import re

msg = 'Product is AE-42'
pattern = re.compile(r'(?P<cate>[A-Z]{2})-(?P<code>[0-9]{2})')

result = pattern.sub(r'Category=\g<cate>/Code=\g<code>', msg)
print(result)

>> Product is Category=AE/Code=42

今回のサンプルでは正規表現パターンに 2 つの名前付きキャプチャグループが含まれます。新しい文字列の中で \cate と \code を使ってキャプチャグループでキャプチャした文字列を参照し置換する新しい文字列を指定しています。

置換する新しい文字列として関数を指定する

sub メソッド(および sub2 メソッド)では置換する新しい文字列の代わりに関数を指定することができます。置換が行われるたびに関数が呼び出され、関数からの戻り値が新しい値として置換されます。関数は呼び出されるときにマッチオブジェクトを引数として渡します。

次のサンプルを見てください。

import re

msg = 'Border is Red, Box is Green, Line is BLUE'
pattern = re.compile(r'\b[a-zA-Z]+?\b')

def replaceStr(m):
    s = m.group(0)
    return s.lower()

result = pattern.sub(replaceStr, msg)
print(result)

>> border is red, box is green, line is blue

今回のサンプルではアルファベットで構成された単語にマッチする文字列を置換します。パターンにマッチすると関数が呼び出されて、関数内でマッチした文字列を取得し、文字列をすべて小文字に変換してから戻り値として返します。戻り値として取得した値を新しい値として置換を行います。結果的に、文字列の中のアルファベットで構成されたすべての単語が小文字に変換されました。

-- --

Python の正規表現で sub メソッドおよび subn メソッドを使って正規表現にマッチした文字列を新しい文字列に置換する方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。