2013-01-09 12 views
6

Często chce się wyświetlić wszystkie znaki w danej kategorii Unicode. NpSkutecznie wyświetla wszystkie znaki w danej kategorii Unicode.

jest możliwe wytworzenie tej listy iteracji przez cały kod granicznymi i testowanie Unicode żądanej kategorii (Python 3)

[c for c in map(chr, range(0x110000)) if unicodedata.category(c) in ('Ll',)] 

lub użycie wyrażeń regularnych,

re.findall(r'\s', ''.join(map(chr, range(0x110000)))) 

Ale te metody są powolne. Czy istnieje sposób, aby wyszukać listę znaków w kategorii bez konieczności powtarzania ich wszystkich?

Podobne pytanie do Perl: How do I get a list of all Unicode characters that have a given property?

Odpowiedz

9

Jeśli trzeba to robić często, to dość łatwo zbudować sobie wielokrotnego użytku mapę:

import sys 
import unicodedata 
from collections import defaultdict 

unicode_category = defaultdict(list) 
for c in map(chr, range(sys.maxunicode + 1)): 
    unicode_category[unicodedata.category(c)].append(c) 

a stamtąd na zewnątrz wykorzystanie odwzorować ponownie na serię znaków dla danej kategorii:

alphabetic = unicode_category['Ll'] 

Jeśli jest to zbyt kosztowne na początek p czas, rozważ zrzut tej struktury do pliku; ładowanie tego odwzorowania z pliku JSON lub innego formatu szybkiego do parsowania do dyktowania nie powinno być zbyt bolesne.

Po wykonaniu mapowania wyszukiwanie kategorii odbywa się w stałym czasie.

+4

chr() powinno być zastąpione przez unichr() na mapie() –

+2

@ m.kocikowski: chyba że używasz Pythona 3, który wyraźnie oznacza OP pytania (w przeciwnym razie nie powiedzie się w Pythonie 2). –