str.translateを使用できます:
import collections
import string
table = collections.defaultdict(lambda: None)
table.update({
ord('é'):'e',
ord('ô'):'o',
ord(' '):' ',
ord('\N{NO-BREAK SPACE}'): ' ',
ord('\N{EN SPACE}'): ' ',
ord('\N{EM SPACE}'): ' ',
ord('\N{THREE-PER-EM SPACE}'): ' ',
ord('\N{FOUR-PER-EM SPACE}'): ' ',
ord('\N{SIX-PER-EM SPACE}'): ' ',
ord('\N{FIGURE SPACE}'): ' ',
ord('\N{PUNCTUATION SPACE}'): ' ',
ord('\N{THIN SPACE}'): ' ',
ord('\N{HAIR SPACE}'): ' ',
ord('\N{ZERO WIDTH SPACE}'): ' ',
ord('\N{NARROW NO-BREAK SPACE}'): ' ',
ord('\N{MEDIUM MATHEMATICAL SPACE}'): ' ',
ord('\N{IDEOGRAPHIC SPACE}'): ' ',
ord('\N{IDEOGRAPHIC HALF FILL SPACE}'): ' ',
ord('\N{ZERO WIDTH NO-BREAK SPACE}'): ' ',
ord('\N{TAG SPACE}'): ' ',
})
table.update(dict(zip(map(ord,string.ascii_uppercase), string.ascii_lowercase)))
table.update(dict(zip(map(ord,string.ascii_lowercase), string.ascii_lowercase)))
table.update(dict(zip(map(ord,string.digits), string.digits)))
print('123 fôé BAR҉'.translate(table,))
収量
123 foe bar
マイナス面としては、翻訳したいすべての特殊なアクセント付き文字をリストする必要があります. @gnibbler の方法では、コーディングが少なくて済みます。
利点としては、このstr.translate
メソッドはかなり高速である必要があり、セットアップが完了すると、1 回の関数呼び出しですべての要件 (小文字化、アクセント記号の削除、および削除) を処理できますtable
。
ところで、200K 文字のファイルはそれほど大きくありません。str
そのため、ファイル全体を単一の に読み取り、それを 1 回の関数呼び出しで変換する方が効率的です。