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

Posted

技术标签:

【中文标题】有效地列出给定 Unicode 类别中的所有字符【英文标题】:Efficiently list all characters in a given Unicode category 【发布时间】:2013-01-09 20:30:16 【问题描述】:

通常需要列出给定 Unicode 类别中的所有字符。例如:

List all Unicode whitespace, How can I get all whitespaces in UTF-8 in Python? Characters with the property 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?

【问题讨论】:

顺便说一句,如果你只是想看看哪些字符属于哪些类别,我用all the characters做了一个页面。 【参考方案1】:

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

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 文件或其他快速解析到字典的格式加载此映射应该不会太痛苦。

一旦你有了映射,查找一个类别当然是在恒定时间内完成的。

【讨论】:

@m.kocikowski:除非您使用的是 Python 3,否则问题的 OP 显然是(否则它会在 Python 2 中失败)。

以上是关于有效地列出给定 Unicode 类别中的所有字符的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Postgres 中搜索包含给定 unicode 字符的所有行

替换给定 unicode 字符串中的所有表情符号

java代码点 代码单元

如何在 Perl 中枚举所有 Unicode 规范等效序列?

如何从java中的字符串中删除无效的unicode字符

java正则表达式中的POSIX 字符类和Unicode 块和类别的类介绍