通常,人们希望列出给定Unicode类别中的所有字符。例如:
Alphabetic
可以通过迭代所有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?
答案 0 :(得分: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']
如果这对于启动时来说太昂贵,请考虑将该结构转储到文件中;从JSON文件或其他快速解析到dict格式加载此映射不应该太痛苦。
完成映射后,查找类别当然是在恒定的时间内完成的。