我需要能够在 python 中的 ICU 归类算法 中找到给定字符的紧随其后的字符。
我的用例是,我正在使用该算法进行排序的 no-sql 数据库中查询键,我需要所有以一组字符开头的键。
我要找的是一个函数:
def nextchar(x):
return x[:-1]+next_in_icu(x[-1:])
先是一些背景信息,然后是可能的解决方案。
ICU 使用 CLDR 整理算法,这是 Unicode 整理算法的剪裁。 CLDR 中的基本排序规则称为根排序规则。
特定于语言的定制包含对根排序规则的最小更改。所以任何 ICU collator 实例都将支持所有 Unicode。在每个序列中,有多个排序规则强度,因此尝试根据排序规则键执行您想要的操作将是复杂且低效的。
ICU 也有一个 AlphabeticIndex 类,但这对您的需求来说太粗糙了。
可能最合适的是 CLDR 的每个语言环境的示例字符。我将根据示例字符提出我的建议。我假设不需要补充字符。
import icu
def get_next_char(x, lang):
exemplarSet = icu.LocaleData(lang).getExemplarSet(0, 0)
characters = list(exemplarSet)
if x is None:
return characters[0]
index = characters.index(x.lower())
return characters[index+1]
def nextchars(x, lang):
result = x + get_next_char(None, lang) if len(x) == 1 else x[:-1]+get_next_char(x[-1:], lang)
return result
get_next_char()
有两个参数,一个是你试图找到下一个的字符,另一个是语言。您需要使用语言标签而不是语言环境对象。
这将创建一个包含集合的 UnicodeSet 对象,在上下文中类似于正则表达式集。
然后将 UnicodeSet 转换为列表,集合中的范围在类型转换为列表期间被转换为单个字符的序列。
找到字符的索引,然后在列表中找到下一个字符。
我没有在示例中处理错误,这是需要添加的东西。
例子:
nextchars('fin', 'en')
# 'fio'
nextchars('str', 'en')
# 'sts'
nextchars("b", "en")
'ba'
假设我已经正确理解了你的问题。