有效地列出给定Unicode类别中的所有字符

Mec*_*ail 9 python unicode character-properties

通常,人们希望列出给定Unicode类别中的所有字符.例如:

通过迭代所有Unicode代码点并测试所需类别(Python 3),可以生成此列表:

[c for c in map(chr, range(0x110000)) if unicodedata.category(c) in ('Ll',)]
Run Code Online (Sandbox Code Playgroud)

或使用正则表达式,

re.findall(r'\s', ''.join(map(chr, range(0x110000))))
Run Code Online (Sandbox Code Playgroud)

但这些方法很慢.有没有办法在类别中查找字符列表而不必遍历所有字符?

与Perl相关的问题:如何获取具有给定属性的所有Unicode字符的列表?

Mar*_*ers 10

如果您需要经常这样做,那么很容易为自己构建一个可重复使用的地图:

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)
Run Code Online (Sandbox Code Playgroud)

从那里开始使用该地图转换回给定类别的一系列字符:

alphabetic = unicode_category['Ll']
Run Code Online (Sandbox Code Playgroud)

如果这对于启动时来说太昂贵,可以考虑将该结构转储到文件中; 从JSON文件或其他快速解析到dict格式加载此映射不应该太痛苦.

获得映射后,查找类别的过程当然是在恒定的时间内完成的.

  • @ m.kocikowski:除非你使用Python 3,问题的OP显然是(否则它在Python 2中失败). (5认同)
  • 应该用map()中的unichr()替换chr() (4认同)