文字列を置換する方法を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'
まとめ
文字列の置き換える方法について、以下3つについてまとめました。
- str.replace(): 決まった文字列を置き換えるのに便利。
- str.translate(): 決まった文字列を置き換えるのに便利。また文字の入れ替えも簡単にできる。
- 正規表現re.sub(): あるパターンの文字列を置き換えるのに便利。
【Python】正規表現を用いたパターンマッチング(reモジュール)