@nhahtdh によって提案された答えは有効ですが、正規表現操作よりも不透明でないコードを使用し、python の組み込みデータ構造と無名関数機能を利用する正規の例よりも pythonic ではないと主張します。
この文脈では、翻訳の辞書は理にかなっています。実際、この例 (ActiveState http://code.activestate.com/recipes/81330-single-pass-multiple-replace/からコピー)に示すように、それが Python クックブックのやり方です。
import re
def multiple_replace(dict, text):
# Create a regular expression from the dictionary keys
regex = re.compile("(%s)" % "|".join(map(re.escape, dict.keys())))
# For each match, look-up corresponding value in dictionary
return regex.sub(lambda mo: dict[mo.string[mo.start():mo.end()]], text)
if __name__ == "__main__":
text = "Larry Wall is the creator of Perl"
dict = {
"Larry Wall" : "Guido van Rossum",
"creator" : "Benevolent Dictator for Life",
"Perl" : "Python",
}
print multiple_replace(dict, text)
したがって、あなたの場合、辞書を作成して、翻訳したいテキストと一緒にtrans = {"a": "aa", "b": "bb"}
渡すことができます。multiple_replace
基本的に、その関数が行っていることは、翻訳するすべての正規表現を含む 1 つの巨大な正規表現を作成し、それが見つかったら、ラムダ関数を渡しregex.sub
て翻訳辞書検索を実行することだけです。
ファイルからの読み取り中にこの関数を使用できます。たとえば、次のようになります。
with open("notes.txt") as text:
new_text = multiple_replace(replacements, text.read())
with open("notes2.txt", "w") as result:
result.write(new_text)
Web スクレイピング タスクのために年の月をチェコ語から英語に変換する必要がある場合に、実際にこの正確な方法を本番環境で使用しました。
@nhahtdh が指摘したように、このアプローチの欠点の 1 つは、プレフィックスフリーではないことです。他のディクショナリ キーのプレフィックスであるディクショナリ キーにより、メソッドが壊れます。