Pythonのtranslateメソッドで文字列を翻訳する方法を解説する

スポンサーリンク

PythonのStringクラスの組み込みメソッドである str.translate() は、文字列と翻訳テーブルを対応付けるために使用されます。

translate()メソッドは、単純に翻訳テーブルのルールで変換します。

今回は、このメソッドについて詳しく理解しましょう。

スポンサーリンク

Python の構文 String translate()

translate() 関数は、文字列中の各文字を与えられた翻訳テーブルで置き換えた新しい文字列を返すので、入力は文字列とテーブルで、文字列を返します。

しかし、これは str クラスに属するメソッドなので、入力の文字列オブジェクトを使用して呼び出すだけです。

out_str = in_str.translate(translation_table)

ここで、translation_table は関連するマッピングを格納した翻訳テーブルです。

翻訳テーブルが何であるかは分かっているが、それがどのように構築されるかはまだ分かっていない。

それも含めて理解しよう。

maketrans()を用いて翻訳テーブルを作成します。

maketrans()`メソッドを使って、翻訳テーブルを作成することができます

どんなマッピングでも翻訳テーブルとして動作するので、既存のPython辞書を翻訳テーブルにすることも可能です。

maketrans()のシンタックス。

maketrans() は常に str.maketrans() を用いて呼び出す。

ここで str は Python の string クラスを表す組み込みキーワードです。

引数が 1 つだけの場合、それは Unicode 序数(整数)または文字(長さ 1 の文字列)を Unicode 序数、文字列(任意の長さ)または None にマッピングする辞書(dict_map)でなければなりません。

そして、文字キーは序数に変換されます。

translation = str.maketrans(dict_map)

引数が2つある場合、それらは同じ長さの文字列 (str_xstr_y) でなければならず、結果の辞書において、x の各文字は y の同じ位置の文字にマップされます。

translation = str.maketrans(str_x, str_y)

第3引数を指定する場合は、文字列 (str_z) でなければならず、その文字は結果の中で None にマップされる。

translation = str.maketrans(str_x, str_y, str_z)

翻訳を実行する

maketrans()を使って翻訳テーブルを作成した後、python string translate()を使って入力文字列から出力文字列への翻訳を行うことができます。

maketrans()`の3つの使い方の例を挙げて、理解を深めていきましょう。

辞書マッピングの使用

# Input string
inp_str = 'Hello from Python'
 
# Create a Dictionary for the mapping
dict_map = dict()
 
# We shift every letter from A-z by 9 units
# using ord() to get their ASCII values
for i in range(ord('A'), ord('z')):
    dict_map[chr(i)] = chr(i + 9)
 
# Convert the dictionary mapping to a translation table
translation = str.maketrans(dict_map)
 
# Perform the translation
out_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’に変換します。

結果は以下の通りです。

aBCDBCa
abcdbca

繰り返しますが、このオプションは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 string
inp_str = 'Hello from Python'
 
translation = str.maketrans('As', 'ab', 'e')
 
# Perform the translation
out_str = inp_str.translate(translation)
 
print(out_str)

これは ‘As’ を ‘ab’ に置き換え、’e’ を None に置き換え、効果的に文字列からその文字を削除します。

出力は以下の通りです。

Hllo from abkPython

ディクショナリーマッピングを直接構築する

maketrans()`を呼び出す際に、直接Dictionaryのマッピングを作成することができます

# Input string
inp_str = 'Hello from Python'
 
translation = str.maketrans({ord('A'): 'a', ord('s'): 'b', ord('e'): None})
 
# Perform the translation
out_str = inp_str.translate(translation)
 
print(out_str)

これは、同じ翻訳テーブルを持つので、前のスニペットと同じ出力になります。

出力は以下の通りです。

Hllo from abkPython

NOTE: maketrans() に文字列を引数として渡す場合とは異なり、Unicode 値 (マッピング辞書の ord() キー) を任意の文字列にマップすることができます

つまり、{ord('A'): 'hello'} のようなマッピングは有効であり、’A’ を ‘hello’ に置き換えます。

まとめ

この記事では、Pythonの文字列translate()メソッドを使用して、Pythonの翻訳テーブルを基に文字列翻訳を行う方法について学びました。

また、様々な方法でそのようなテーブルを構築する方法についても見てきました。

タイトルとURLをコピーしました