PythonのStringクラスの組み込みメソッドである str.translate() は、文字列と翻訳テーブルを対応付けるために使用されます。
translate()メソッドは、単純に翻訳テーブルのルールで変換します。
今回は、このメソッドについて詳しく理解しましょう。
Python の構文 String translate()
translate() 関数は、文字列中の各文字を与えられた翻訳テーブルで置き換えた新しい文字列を返すので、入力は文字列とテーブルで、文字列を返します。
しかし、これは str クラスに属するメソッドなので、入力の文字列オブジェクトを使用して呼び出すだけです。
out_str = in_str.translate(translation_table)
|
ここで、translation_table は関連するマッピングを格納した翻訳テーブルです。
翻訳テーブルが何であるかは分かっているが、それがどのように構築されるかはまだ分かっていない。
それも含めて理解しよう。
この記事もチェック:Pythonのbool関数の使い方|数字、文字列、クラスでの使い方を解説する
maketrans()を用いて翻訳テーブルを作成します。
maketrans()`メソッドを使って、翻訳テーブルを作成することができます。
どんなマッピングでも翻訳テーブルとして動作するので、既存のPython辞書を翻訳テーブルにすることも可能です。
maketrans()のシンタックス。
maketrans() は常に str.maketrans() を用いて呼び出す。
ここで str は Python の string クラスを表す組み込みキーワードです。
引数が 1 つだけの場合、それは Unicode 序数(整数)または文字(長さ 1 の文字列)を Unicode 序数、文字列(任意の長さ)または None にマッピングする辞書(dict_map)でなければなりません。
そして、文字キーは序数に変換されます。
translation = str.maketrans(dict_map)
|
引数が2つある場合、それらは同じ長さの文字列 (str_x と str_y) でなければならず、結果の辞書において、x の各文字は y の同じ位置の文字にマップされます。
translation = str.maketrans(str_x, str_y)
|
第3引数を指定する場合は、文字列 (str_z) でなければならず、その文字は結果の中で None にマップされる。
translation = str.maketrans(str_x, str_y, str_z)
|
この記事もチェック:Pythonのstrptimeを使って文字列を日付時刻に変換する方法
翻訳を実行する
maketrans()を使って翻訳テーブルを作成した後、python string translate()を使って入力文字列から出力文字列への翻訳を行うことができます。
maketrans()`の3つの使い方の例を挙げて、理解を深めていきましょう。
辞書マッピングの使用
# Input stringinp_str = 'Hello from Python'
# Create a Dictionary for the mappingdict_map = dict()
# We shift every letter from A-z by 9 units# using ord() to get their ASCII valuesfor i in range(ord('A'), ord('z')):
dict_map[chr(i)] = chr(i + 9)
# Convert the dictionary mapping to a translation tabletranslation = str.maketrans(dict_map)
# Perform the translationout_str = inp_str.translate(translation)
print(out_str)
|
出力は、すべての文字を9箇所右にシフトした文字列となる。
出力は
Qnuux o{xv J|tYA}qxw |
ダイレクトマッピングの使用
ここでは、ダイレクトマッピングを利用して、2つの引数を用いて翻訳テーブルを構築し、それを入力文字列の translate() 関数に渡すより簡単な例を示します。
s = 'ABCDBCA'
translation = s.maketrans('A', 'a')
print(s.translate(translation))
translation = s.maketrans('ABCD', 'abcd')
print(s.translate(translation))
|
これは以下のように、最初の’A’文字を’a’に変換し、’ABCD’を’abcd’に変換します。
結果は以下の通りです。
aBCDBCaabcdbca |
繰り返しますが、このオプションは2つの文字列の長さが同じであることを指定しているので、それ以外の場合は ValueError 例外を発生させます。
s = 'ABCDBCA'
translation = s.maketrans('Ab', 'a')
print(s.translate(translation))
|
出力は以下の通りです。
ValueError: the first two maketrans arguments must have equal length |
Noneマッピングの使用
以下は、3つの引数で maketrans() を呼び出し、None マッピングを使用する簡単な例です。
# Input stringinp_str = 'Hello from Python'
translation = str.maketrans('As', 'ab', 'e')
# Perform the translationout_str = inp_str.translate(translation)
print(out_str)
|
これは ‘As’ を ‘ab’ に置き換え、’e’ を None に置き換え、効果的に文字列からその文字を削除します。
出力は以下の通りです。
Hllo from abkPython |
ディクショナリーマッピングを直接構築する
maketrans()`を呼び出す際に、直接Dictionaryのマッピングを作成することができます。
# Input stringinp_str = 'Hello from Python'
translation = str.maketrans({ord('A'): 'a', ord('s'): 'b', ord('e'): None})
# Perform the translationout_str = inp_str.translate(translation)
print(out_str)
|
これは、同じ翻訳テーブルを持つので、前のスニペットと同じ出力になります。
出力は以下の通りです。
Hllo from abkPython |
NOTE: maketrans() に文字列を引数として渡す場合とは異なり、Unicode 値 (マッピング辞書の ord() キー) を任意の文字列にマップすることができます。
つまり、{ord('A'): 'hello'} のようなマッピングは有効であり、’A’ を ‘hello’ に置き換えます。
まとめ
この記事では、Pythonの文字列translate()メソッドを使用して、Pythonの翻訳テーブルを基に文字列翻訳を行う方法について学びました。
また、様々な方法でそのようなテーブルを構築する方法についても見てきました。