次のような行がある巨大なファイルがあります。
"エン ジェネラル ウン トラス ボン ホテル ラ テラス デュ バー プレキャット デュ ロビー"
これらの Sinographic 文字をファイルの行から削除して、これらの行がローマ字のみの新しいファイルを取得するにはどうすればよいですか? 私は正規表現を使用することを考えていました。アラビア数字、a-nA-N、その他 (句読点) など、すべてのローマ字の文字クラスはありますか?
このような状況では、この正規表現チート シートが非常に便利です。
# -*- coding: utf-8
import re
import string
u = u"En.!?+ 123 g茅n茅ral un tr猫s bon hotel La terrasse du bar pr猫s du lobby"
p = re.compile(r"[^\w\s\d{}]".format(re.escape(string.punctuation)))
for m in p.finditer(u):
print m.group()
>>> 茅
>>> 茅
>>> 猫
>>> 猫
私はunidecode
モジュールの大ファンでもあります。
from unidecode import unidecode
u = u"En.!?+ 123 g茅n茅ral un tr猫s bon hotel La terrasse du bar pr猫s du lobby"
print unidecode(u)
>>> En.!?+ 123 gMao nMao ral un trMao s bon hotel La terrasse du bar prMao s du lobby
正規表現なしで実行できます。
ASCII 文字のみを保持するには:
# -*- coding: utf-8 -*-
import unicodedata
unistr = u"En g茅n茅ral un tr猫s bon hotel La terrasse du bar pr猫s du lobby"
unistr = unicodedata.normalize('NFD', unistr) # to preserve `e` in `é`
ascii_bytes = unistr.encode('ascii', 'ignore')
ASCII 文字、数字、句読点以外のすべてを削除するには:
from string import ascii_letters, digits, punctuation, whitespace
to_keep = set(map(ord, ascii_letters + digits + punctuation + whitespace))
all_bytes = range(0x100)
to_remove = bytearray(b for b in all_bytes if b not in to_keep)
text = ascii_bytes.translate(None, to_remove).decode()
# -> En gnral un trs bon hotel La terrasse du bar prs du lobby