在 python 中获取“字母”下一个 unicode 字符

问题描述 投票:0回答:1

我需要能够在 python 中的 ICU 归类算法 中找到给定字符的紧随其后的字符。

我的用例是,我正在使用该算法进行排序的 no-sql 数据库中查询键,我需要所有以一组字符开头的键。

我要找的是一个函数:

def nextchar(x):
    return x[:-1]+next_in_icu(x[-1:])
python python-3.x unicode couchdb icu
1个回答
0
投票

先是一些背景信息,然后是可能的解决方案。

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'

假设我已经正确理解了你的问题。

© www.soinside.com 2019 - 2024. All rights reserved.