2013-01-09 23 views
6

通常希望列出給定Unicode類別中的所有字符。例如:高效地列出給定Unicode類別中的所有字符

,能夠產生該列表通過遍歷所有Unicode碼點和測試所需的類別(Python 3中):

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

或使用正則表達式,

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

但是這些方法很慢。有沒有辦法查找類別中的字符列表,而無需遍歷所有的字符?

Perl的相關問題:How do I get a list of all Unicode characters that have a given property?

回答

9

如果你需要經常這樣做,它很容易建立自己的可重複使用的地圖:

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) 

並從那裏出來使用該地圖轉換回一系列字符給定類別:

alphabetic = unicode_category['Ll'] 

如果這是成本過於昂貴的啓動-U p時間,考慮將該結構傾倒到文件中;從JSON文件或其他快速解析到字典格式加載此映射應該不會太痛苦。

一旦你有了映射,當然在恆定時間內查找一個類別。

+4

應該用map() –

+2

@ m.kocikowski中的unichr()替換chr():除非您使用的是Python 3,問題的OP明確表示(否則在Python 2中會失敗)。 –

相關問題