正規表現にマッチした文字列を新しい文字列に置換する
【開発環境】
OS:Win10(64ビット)
言語:Python3.8.5(64bit)
Python の統合開発環境:IDLE
IDLEの操作は別サイト参照のこと
【subメソッドの書式と使い方】
Pattern クラスの sub メソッドは、対象の文字列の中で正規表現パターンにマッチした部分文字列を新しい文字列に置換し、置換後の文字列を返します。
・書式
Pattern.sub(repl, string, count=0)
Pattern クラスの subn メソッドは、 sub メソッドと同じ動作をしますが、置換後に文字列を返すのではなく新しい文字列と置換した回数の 2 つの要素が含まれるタプルを返します
・書式
Pattern.subn(repl, string, count=0)
どちらのメソッドも 1 番目の引数に置き換える新しい文字列を指定し、 2 番目の引数に対象の文字列を指定します。省略可能な 3 番目の引数には最大置換回数を指定します。
サンプルコード
>>> import re
>>> msg = 'Border is Red, Box is red, Line is RED'
>>> pattern = re.compile(r'Red|RED')←パターンとして「Red」か「RED」
>>> result = pattern.sub('red', msg)
>>> print(result)
Border is red, Box is red, Line is 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 番目の引数に最大置換回数を指定することができます。
サンプルコード
Python 3.8.5 (tags/v3.8.5:580fbb0, Jul 20 2020, 15:57:54) [MSC v.1924 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license()" for more information.
>>> 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に設定する
>>> result2 = pattern.sub('***', msg, 2)
>>> print(result2)
*** *** Yellow Pink Green White
>>>
【キャプチャグループにマッチした文字列を参照する】
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日 です
>>>
新しい文字列の中で \1 \2 \3 を使ってキャプチャグループでキャプチャした文字列を参照し置換する新しい文字列を指定しています。
名前付きキャプチャグループを使用している場合
>>> import re
>>> msg = 'Product is AE-42'
>>> pattern = re.compile(r'(?P<cate>[A-Z]{2})-(?P
[0-9]{2})')
>>> result = pattern.sub(r' Category=\g<cate>/Code=\g', msg)
>>> print(result)
Product is Category=AE/Code=42
>>>
新しい文字列の中で \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
>>>
パターンにマッチすると関数が呼び出されて、関数内でマッチした文字列を取得し、文字列をすべて小文字に変換してから戻り値として返します。
戻り値として取得した値を新しい値として置換を行います。結果的に、文字列の中のアルファベットで構成されたすべての単語が小文字に変換されました。
※コメント投稿者のブログIDはブログ作成者のみに通知されます