文字列のメソッドstr.translate()を用いて文字を置換する方法について、
- 文字の置き換え表の作成方法
- 置き換え表を用いたtranslate()の使い方
について具体例を用いてわかりやすくまとめます。
この関数で文字列を置換する際は注意が必要ですが、replace()とは異なり一つの文で文字の交換が可能というメリットがあります。
str.translate()の使い方
str.translate() は、置き換え表を使って下記に示す文字の置き換えが可能です。
- 文字 → 文字 (例:”a” -> “x”)
- 文字 → 文字列 (例:”a” -> “xxx”)
- 文字 → None (文字の削除)
使い方は以下です。
str.translate(table)
引数tableは先に述べた文字の置き換え表です。
またこの関数は置き換え後のコピーを返すので、元のデータは変わりません。
「置き換え表」の生成
置き換え表は、関数str.maketrans() を使って作成できます。
使い方は下記の通りで、引数を3つ設定することが可能です。
str.maketrans(x[, y[, z]])
引数を1つ設定する場合
引数を1つ設定する場合、引数xは辞書(dict)型を指定する必要があります。
str.maketrans(x)
具体例をコードで示します。
尚、返り値の数値は該当する文字のUnicode序数です。
- 文字 → 文字 (例:”a” -> “x”)
>>> str.maketrans({"a" : "x"})
{97: 'x'}
複数文字を置換する場合は辞書に追加します。(例:”a” -> “x”、”b” -> “y”)
>>> str.maketrans({"a" : "x", "b" : "y"})
{97: 'x', 98: 'y'}
尚、辞書のキーは、長さ1の文字を設定する必要がありますので、下記の場合はエラーとなります。
>>> str.maketrans({"ab" : "xy"}) ★辞書のキーの長さが1でない
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: string keys in translate table must be of length 1
>>> str.maketrans({"a" : "xxx"})
{97: 'xxx'}
複数文字を置換する場合は辞書に追加します。
>>> str.maketrans({"a" : "xxxx", "b" : "yy"})
{97: 'xxxx', 98: 'yy'}
>>> str.maketrans({"a" : None})
{97: None}
複数文字を削除する場合は辞書に追加します。
>>> str.maketrans({"a" : None, "b" : None})
{97: None, 98: None}
引数を2つ設定する場合
引数を2つ設定する場合は、下記の使い方になります。
str.maketrans(x, y)
- 第一引数x: 置き換え元の文字
- 第二引数y: 置き換え後の文字
具体例をコードで示します。
- 文字 → 文字 (例:”a” -> “x”)
>>> str.maketrans('a', 'x')
{97: 120}
複数文字を置換する場合は下記のように短縮して記述。(例:”a” -> “x”、”b” -> “y”)
>>> str.maketrans('ab', 'xy')
{97: 120, 98: 121}
この場合、文字列”ab” → ”xy”の置換ではないことに注意。
“a” -> “x” および”b” -> “y”の置換を表しているので、”ba” → ”yx”も置き換わります。
引数2つの条件では設定不可。
第一引数xと第二引数yは長さを同一にする必要があるので、下記の記述はエラーになります。
>>> str.maketrans('a', 'xxxx')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: the first two maketrans arguments must have equal length
この場合は引数一つで辞書型で設定するのが良いです。
引数2つの条件では設定不可。
第二引数yは文字列(str型)である必要があるので、下記の記述はエラーとなります。
>>> str.maketrans('a', None)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: maketrans() argument 2 must be str, not None
この場合は、引数一つで辞書型で設定する(前項)か、次項で述べる第三引数を用いたほうが良いです。
引数を3つ設定する場合
第三引数zは、削除する文字を設定します。第一引数x、第二引数yは前項と同じです。
str.maketrans(x, y, z)
- 第一引数x: 置き換え元の文字
- 第二引数y: 置き換え後の文字
- 第三引数z: 削除する文字
具体例をコードで示します。
- 文字 → None (文字の削除)
# 文字の置換および削除
>>> str.maketrans('a', 'x', "b")
{97: 120, 98: None}
# 削除のみ
# (第三引数が必要なのでダミーで第一、第二引数を設定)
>>> str.maketrans("", "", "a")
{97: None}
translate()を使った文字の置き換え
文字の置き換え表ができたので、これをtranlate()の引数に渡して置換処理を行います。
具体例を下記に示します。
- 文字 → 文字 (例:”a” -> “x”)
>>> table = str.maketrans("a", "x")
>>> s = "abcdef"
>>> s.translate(table)
'xbcdef'
複数文字を置換する場合は下記のように短縮して記述。
# 例:”a” -> “x”、”b” -> “y”、”c” -> “z”
>>> table = str.maketrans("abc", "xyz")
>>> s = "abc-def-cba"
>>> s.translate(table)
'xyz-def-zyx'
ここで、”abc”だけでなく”cba”も置換されていることに注意。
文字列の置換ではありません
>>> table = str.maketrans({"a" : "****"})
>>> s.translate(table)
'****bcdef'
>>> s = "abcd"
# 第三引数が必要なのでダミーで第一、第二引数を設定
>>> table = str.maketrans("", "", "a")
>>> s.translate(table)
'bcd'
# または
>>> table = str.maketrans({"a" : None})
>>> s.translate(table)
'bcd'
文字の入れ替え
この関数は複数の文字を一括で変換するので、文字の入れ替えが可能です。
例を以下に示します。
>>> table = str.maketrans("az", "za")
>>> s = "a z a z"
>>> s.translate(table)
'z a z a'
ちなみにreplace()を単純に2回繰り返して置換になりません。少し工夫が必要になります。
# 単純に2回繰り返しても置換になりません
>>> s = "a z a z"
>>> s.replace("a", "z").replace("z", "a")
'a a a a'
# 例えば途中でダミーの置換を置くとできます。
>>> s_ = s.replace("a", "_") # '_ z _ z'
>>> s_ = s_.replace("z", "a") # '_ a _ a'
>>> s_ = s_.replace("_", "z") # 'z a z a'
環境
- OS: Ubuntu20.04LTS@WSL2
- Python3.9.7
まとめ
文字列(str)のメソッドtranslate()を用いた文字の置換方法についてまとめました。
- str.makerans(x, y, z)を用いた置き換え表の作成
- str.translate(table)を用いた文字の置換
<参考記事>
文字(列)を置換する他の組込み関数(str.replace()、re.sub())と併せて、それぞれの関数の特徴と使い方をまとめています。ご参照ください。