0

次のような行がある巨大なファイルがあります。

"エン ジェネラル ウン トラス ボン ホテル ラ テラス デュ バー プレキャット デュ ロビー"

これらの Sinographic 文字をファイルの行から削除して、これらの行がローマ字のみの新しいファイルを取得するにはどうすればよいですか? 私は正規表現を使用することを考えていました。アラビア数字、a-nA-N、その他 (句読点) など、すべてのローマ字の文字クラスはありますか?

4

3 に答える 3

4

このような状況では、この正規表現チート シートが非常に便利です。

# -*- 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
于 2013-07-25T15:28:08.290 に答える
1

正規表現なしで実行できます。

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
于 2013-07-25T18:33:49.863 に答える