@nhahtdh 提出的答案是有效的,但我认为比规范示例更少 pythonic,它使用的代码比他的正则表达式操作更不透明,并利用了 python 的内置数据结构和匿名函数特性。
在这种情况下,翻译词典是有意义的。事实上,Python Cookbook 就是这样做的,如本例所示(复制自 ActiveState http://code.activestate.com/recipes/81330-single-pass-multiple-replace/)
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)
因此,在您的情况下,您可以制作一个 dict trans = {"a": "aa", "b": "bb"}
,然后将其multiple_replace
与您要翻译的文本一起传递。基本上,该函数所做的只是创建一个包含所有要翻译的正则表达式的巨大正则表达式,然后当找到一个时,传递一个 lambda 函数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)
我实际上在生产中使用了这种精确的方法,在我需要将一年中的月份从捷克语翻译成英语以进行网络抓取任务的情况下。
正如@nhahtdh 指出的那样,这种方法的一个缺点是它不是无前缀的:作为其他字典键前缀的字典键将导致该方法中断。