【Python】任意の文字列を置換する3つの方法

文字列を置換する方法を3つ解説します。

  • 文字列のメソッド str.replace()を使う
  • 文字列のメソッド str.translate()を使う
  • 正規表現 re.sub()を使う

最初の2つ(replaceとtranslate)は置き換える文字列が決まっている場合に簡単に書けます。最後の正規表現を使う方法は、検索する文字列のパターンを決めて置き換えることができるので、より高度な使い方ができます。
# 2020/2/17記事更新

確認した環境

  • OS: Ubuntu 16.04LTS
  • Python: ver3.7.4

str.replace()を使った文字列の置換

replace() は文字列のメソッドで、引数に指定した部分文字列を全て置き換えます。返り値は、置換後の文字列のコピーです。元のデータは書き換えられません。

str.replace(old, new[, count])

引数は下記の通りです。

  • 第一引数old: 置き換えの文字(列)
  • 第二引数new: 置き換えの文字(列)
  • オプション引数count: 先頭(左側)から何回置き換えるか

文字列”abc”を”xxx”に置き換える例を以下に示します。

>>> s = 'abc-def-ghi-abc-def-abc'

#文字列中の'abc'を全て'xxx'に置き換える
>>> s.replace('abc', 'xxx')
'xxx-def-ghi-xxx-def-xxx'

# 元の文字列は変更されません
>>> s
'abc-def-ghi-abc-def-abc'

# count引数を設定(この場合は先頭から2個だけ置換)
>>> s.replace('abc', 'xxx', 2)
'xxx-def-ghi-xxx-def-abc'

str.translate()を使った文字列の置換

str.translate() は、「置き換え表」を使って文字列を置き換えます。この関数は置き換え後のコピーを返すので、元のデータは変わりません。

使い方は以下です。引数tableは先に述べた文字の「置き換え表」です。

str.translate(table)

str.maketrans()を使った「置き換え表」の生成

「置き換え表」は、関数str.maketrans() を使って作成できます。
この関数は引数の取り方がいくつかあります。

置き換えする文字の組み合わせを辞書形式で指定する方法

例えば’a’→’x’の置き換え表は下記のように生成します。
尚、返り値に表示されている数字は、該当する文字のUnicode序数です。

>>> str.maketrans({'a' : 'x'})
{97: 'x'}

複数の文字を置き換える場合は、その文字の分だけ辞書データを追加します。
例えば、’a’→’x’、’b’→’y’、’c’→’z’への置き換え表の場合

>>> str.maketrans({'a':'x', 'b':'y', 'c':'z'})
{97: 'x', 98: 'y', 99: 'z'}

尚、この場合は辞書のキーは長さ1の文字しか設定できないので、下記のようにするとValueErrorが送出されます。

>>> str.maketrans({'abc':'xxx'})
Traceback (most recent call last):
    File "", line 1, in 
ValueError: string keys in translate table must be of length 1

置き換えする文字をそれぞれ引数で設定する方法

‘a’→’x’への置き換え表は、下記のように生成します。返り値に表示されている数字は、上記と同様に該当する文字のUnicode序数です。

# 置き換えする文字の組み合わせを2つの引数で指定
>>> str.maketrans('a', 'x')
{97: 120}

複数の文字を置き換える場合は、下記のように文字を連結させて指定できます。
例えば、’a’→’x’、’b’→’y’、’c’→’z’への置き換え表の場合

>>> str.maketrans('abc', 'xyz')
{97: 120, 98: 121, 99: 122}

文字列の置き換え

str.translate()を使った置き換えの例です。上記で生成したstr.maketrans()を引数に与えます。

>>> s = 'abc-def-ghi-abc-def-abc'

#文字列中の'abc'を全て'xxx'に置き換える
>>> s.translate(str.maketrans('abc', 'xxx'))
'xxx-def-ghi-xxx-def-xxx'

# 元の文字列は変更されません
>>> s
'abc-def-ghi-abc-def-abc'

尚、この関数は複数の文字を一括で変換できるので、文字の入れ替えも可能です。
例えば、

>>> s = 'axax'

# 'a' -> 'x'、'x' -> 'a'の置き換え表
>>> s.translate(str.maketrans('ax', 'xa'))
'xaxa'

ちなみにreplace()を2回繰り返すと下記のようになります。置き換えにはならず。。

>>> s = 'axax'

# 'a' -> 'x'の後、'x' -> 'a'に置き換え
>>> s.replace('a', 'x').replace('x', 'a')
'aaaa'

正規表現(re.sub)を使った文字列の置換

正規表現re.sub() を使うと、文字列のパターンを指定して置き換え出来ます。

re.sub(pattern, repl, string, count=0, flags=0)

引数はそれぞれ以下の通り。

  • 第一引数pattern: 置き換えたい文字列の正規表現パターン
  • 第二引数repl: 置き換え後の文字列
  • 第三引数string: 検索する文字列
  • オプション引数count: 先頭(左)から何回置き換えるか

返り値は、置換された文字列のコピーです。元の文字列は変わりません。
以下に例を示します。

>>> s = '123-abc-456-def-789'

# 「3つ並んだ数値」を'***'に置き換える場合
>>> re.sub(r'\d{3}', '***', s)
'***-abc-***-def-***'

# count = 2とすると、先頭から2個の文字列を置換
>>> re.sub(r'\d{3}', '***', s, 2)
'***-abc-***-def-789'

正規表現についてはこちらの記事でもまとめていますので、ご参照ください。
【Python】正規表現を用いたパターンマッチング(reモジュール)

まとめ

文字列の置き換える方法について、以下3つについてまとめました。

  • str.replace(): 決まった文字列を置き換えるのに便利。
  • str.translate(): 決まった文字列を置き換えるのに便利。また文字の入れ替えも簡単にできる。
  • 正規表現re.sub(): あるパターンの文字列を置き換えるのに便利。

Learn more...

書籍でもう少し詳しく学びたい場合はこちらもどうぞ。筆者もかなり参考にさせてもらっています!