正则表达式匹配所有Hangul(韩文)字符和音节块

2024-05-05 21:25:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试验证用户输入(Python)并查看是否使用了正确的语言,本例中是韩语。让我们把韩语单词作为电子邮件地址:이메일주소

我可以这样检查每个字符:

import unicodedata as ud
for chr in u'이메일 주소':
    if 'HANGUL' in ud.name(chr): print "Yep, that's a Korean character."

但这看起来效率很低,尤其是对于较长的文本。当然,我可以创建一个包含所有韩国语音节块的静态字典,但该字典将包含大约25000个字符,而且,这将是低效的检查。另外,我还需要一个日语和汉语的解决方案,这可能包含更多的字符。在

因此,我想对朝鲜文音节块使用覆盖所有Unicode字符的Regex模式。但我不知道是否有一个范围,或者在哪里可以找到它。在

例如,此regex模式覆盖所有基于拉丁语的字符,包括括号和其他常用符号:

^{pr2}$

有人能翻译这个正则表达式来匹配朝鲜文音节块吗?或者你能给我看一个表格或参考来查找这些范围吗?在

一个匹配中文和日语的模式也会很有帮助。或一个正则表达式来同时匹配所有CJK字符。我不需要区分日语和韩语。在

这是一个用于该任务的Python库,但是它可以使用非常庞大的字典:https://github.com/EliFinkelshteyn/alphabet-detector 我无法想象,对于大量的文本和大量的用户输入,它是高效的。在

谢谢!在


Tags: 用户in文本import语言字典电子邮件地址
1条回答
网友
1楼 · 发布于 2024-05-05 21:25:47

您知道Unicode是如何分解成块的,以及每个块如何表示连续的代码点范围吗?也就是说,有一个比正则表达式更有效的解决方案。在

Hangul Jamo有一个单独的代码块,在CJK block、a compatability blockHangul syllables等中有附加字符

最有效的方法是使用if/then语句检查每个字符是否在可接受的范围内。几乎可以肯定的是,使用C扩展可以加快速度。在

例如,如果我只是检查朝鲜文块(不够,但只是一个简单的起始位置),我会用以下代码检查字符串中的每个字符:

def is_hangul_character(char):
    '''Check if character is in the Hangul Jamo block'''

    value = ord(char)
    return value >= 4352 and value <= 4607


def is_hangul(string):
    '''Check if all characters are in the Hangul Jamo block'''

    return all(is_hangul_character(i) for i in string)

对于包含朝鲜文字符的8个左右的blocks来说,很容易将其扩展。没有表查找,没有正则表达式编译。只是基于Unicode字符块的快速范围检查。在

在C语言中,这也非常简单(如果您希望显著提高性能,只需少量工作即可匹配完全优化的库):

^{pr2}$

Edit粗略浏览一下CPython实现,就会发现CPython对unicodedata模块使用了这种方法。也就是说,它是有效的,尽管你自己实现它相对容易。它仍然值得实现,因为您不必分配任何中间字符串,或者使用多余的字符串比较(这可能是unicodedata模块的主要开销)。在

相关问题 更多 >