Pythonと正規表現で文字列を置換する[re.sub, re.subn]
Pythonのreモジュールと正規表現を使って文字列を置き換えするパターンを解説します。
基本的な使い方
Pythonで正規表現を使って文字列の置換を行うには、標準ライブラリのreモジュールのsub()関数を使います。sub()
関数は、正規表現パターンにマッチする文字列を別の文字列に置き換えます。
sub()
関数では、第一引数に正規表現パターン、第二引数に置換後の文字列、第三引数に処理対象の文字列を指定します。
例えば、文字列『abcdefg』の中の『b』を『B』に置き換えるには、次のようにします。
# 'b'を'B'に置き換える
import re
s = 'abcdefg'
s = re.sub('b', 'B', s)
print(s) # 'aBcdefg'
この例では、『b』を正規表現パターンとして指定しています。『b』にマッチする文字列が見つかると、その文字列が『B』に置き換わります。
複数の文字を同時に置き換える
正規表現パターンを使えば、複数の文字列を同時に置き換えることもできます。正規表現では、大括弧[]
を使うと、その中のいずれかの1字にマッチするようになります。
例えば、『abcdefg』の中の『b』と『c』を『C』に置き換えるには、次のようにします。
# 'b'を'B'に、'c'を'C'に置き換える
import re
s = 'abcdefg'
s = re.sub('[bc]', 'C', s)
print(s) # 'aCCdefg'
この例では、『[bc]』という正規表現パターンを使っています。『[bc]』は、『b』または『c』のいずれかにマッチする文字列を指定しているので、『b』と『c』の両方が『C』に置き換わります。
複数のパターンを同時に置き換える
また、正規表現で|
を使うと、それで区切られたいずれかのパターンにマッチするようになります。
例えば、例えば、『abcdefg』の中の『ab』と『cd』と『ef』を『Z』に置き換えるには、次のようにします。
# 'ab'と'cd'と'ef'を'Z'に置き換える
import re
s = 'abcdefg'
s = re.sub('ab|cd|ef', 'Z', s)
print(s) # 'ZZZg'
置き換えする最大回数を指定する[count]
sub()関数の第4引数は「count」引数となっており、置き換えを行う回数を指定することができます。
例えば、「'abcdefg abcdefg abcdefg'」の中の「'b'」を「'B'」に最大で2回だけ置き換えるには、次のようにします。
# 'b'を'B'に、最大2回置き換える
import re
s = 'abcdefg abcdefg abcdefg'
s = re.sub('b', 'B', s)
print(s) # 'aBcdefg aBcdefg abcdefg'
すべての文字を置き換える
すべての文字を置き換えるには、正規表現の『.
』を使います。『.
』は、任意の文字を表すので、すべての文字を置き換えることができます。文章の文字数を表現したまま、マスクをかけるなどに便利です。
例えば、「'abcdefg'」の中の全ての文字を「'X'」に置き換えるには、次のようにします。
# すべての文字を'X'に置き換える
import re
s = 'abcdefg'
s = re.sub('.', 'X', s)
print(s) # 'XXXXXXX'
数字を置き換える
数字を置き換えるには、正規表現の『\d
』を使います。『\d
』は、数字を表すので、すべての文字を置き換えることができます。
例えば、「'abc123def456'」の中の数字を「'X'」に置き換えるには、次のようにします。
# すべての数字を'X'に置き換える
import re
s = 'abc123def456'
s = re.sub('.', 'X', s)
print(s) # 'XXXXXXX'
空白文字を置き換える
空白文字を置き換えるには、正規表現の『\s
』を使います。『\s
』は、空白文字を表すので、空白を埋めることができます。
例えば、「'abc 123 def 456'」の中の空白文字を「'X'」に置き換えるには、次のようにします。
# すべての空白を'X'に置き換える
import re
s = 'abc 123 def 456'
s = re.sub('\s', 'X', s)
print(s) # 'abcX123XdefX456'
また、『\s
』は、改行やタブなど、様々な空白文字を表すので、改行やタブも同時に置き換えることができます。
置換された回数を取得する[re.subn()]
Pythonには、正規表現を使った文字列の置換を行うためのre.sub()関数と、似た機能を持つre.subn()関数があります。
re.sub()
関数は、正規表現を使って文字列を置換し、置換後の文字列を返します。一方、re.subn()
関数は、同じように文字列を置換しますが、置換後の文字列と、置換された回数をタプルで返します。
使い方はとても似ています。
re.subn()
関数の第一引数は、正規表現パターンを表す文字列です。第二引数は、置換後の文字列を表す文字列です。第三引数は、置換される文字列です。以下の例では、置換された回数が『n』に格納され、置換後の文字列が『replaced』に格納されます。
# 数字をXに置き換える
import re
s = 'abc123def456'
replaced, n = re.subn('\d', 'X', s)
print(replaced) # 'abcXXXdefXXX'
print(n) # 6