Pythonと正規表現で文字列を置換する[re.sub, re.subn]

Pythonのreモジュールと正規表現を使って文字列を置き換えするパターンを解説します。

Pythonと正規表現で文字列を置換する[re.sub, re.subn]

基本的な使い方

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