当前位置: 首页 > 知识库问答 >
问题:

匹配所有朝鲜文(朝鲜文)字符和音节块的正则表达式

柳俊彦
2023-03-14

我试图验证用户输入(在Python中),看看是否使用了正确的语言,在本例中是韩语。让我们用韩语来表示电子邮件地址:ymposal

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

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

但这似乎效率很低,特别是对于较长的文本。当然,我可以创建一个包含所有韩语音节块的静态字典,但是该字典将包含大约25,000个字符,并且再次,检查起来效率会很低。还有,我也需要一个解决日语和汉语,可能包含更多的字符。

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

例如,这个正则表达式模式覆盖了所有基于拉丁文的字符,包括括号和其他常用符号:

import re
LATIN_CHARACTERS = re.compile(ur'[\x00-\x7F\x80-\xFF\u0100-\u017F\u0180-\u024F\u1E00-\u1EFF]')

有人能把这个正则表达式翻译成符合朝鲜文音节块吗?或者你能给我一个表或引用来查找这样的范围吗?

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

这里有一个用于该任务的Python库,但它可以与极其庞大的字典一起工作:https://github.com/elifinkelshteyn/alphabet-detector我无法想象这对于大文本和大量用户输入来说是有效的。

谢谢!

共有1个答案

公冶才
2023-03-14

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

朝鲜文Jamo有一个单独的代码块,在CJK块中有额外的字符,一个兼容块,朝鲜文音节等。

最有效的方法是使用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个左右的块是很容易的。没有表查找,没有正则表达式编译。只是基于Unicode字符块的快速范围检查。

在C语言中,这也是非常容易的(如果您希望获得显著的性能提升,那么只需很少的工作就可以匹配一个完全优化的库):

// Return 0 if a character is in Hangul Jamo block, -1 otherwise
int is_hangul_character(char c)
{
    if (c >= 4352 && c <= 4607) {
        return 0;
    }
    return -1;
}


// Return 0 if all characters are in Hangul Jamo block, -1 otherwise
int is_hangul(const char* string, size_t length)
{
    size_t i;
    for (i = 0; i < length; ++i) {
        if (is_hangul_character(string[i]) < 0) {
            return -1;
        }
    }
    return 0;
}

对CPython实现的粗略一瞥显示CPython对unicodedata模块使用了这种精确的方法。也就是说,尽管你自己实现它相对容易,但它还是很有效的。它仍然值得实现,因为您不必分配任何中间字符串或使用多余的字符串比较(这可能是UnicodeData模块的主要成本)。

 类似资料:
  • 我正在arround制作一个与字符串的某个块匹配的正则表达式,问题是它包含许多相似的块,并且没有清楚地分开,所以我不知道如何停止正则表达式。 字符串的例子 所以我要做的是匹配并只选择第一个A1。到目前为止,我所做的是:

  • 我有一些xml文件,希望删除除特定字符串以外的所有内容。 StackOverflow上还有很多类似的问题,但都不适用于我的文件,在尝试了几个小时不同的正则表达式后,我想寻求帮助。 到目前为止,部分成功但并非完全成功的最接近的正则表达式是: xml文件的示例: 我使用regex101,因此可以将示例粘贴在那里,以了解为什么rex只能部分工作。简而言之,它与第一次出现的不匹配,但与第二次出现的匹配。我

  • 问题内容: 我正在尝试查找带有重音符号的数据。我已经试过了: 而且有效。它查找XML数据字段包含where的所有记录。问题在于它仅将大写字母E与重音符匹配。我试图编写一个更通用的查询,以使用对等类查找带有重音元音(a,e,i,o,u,大写和小写以及任何重音)的所有数据。我想要一个正则表达式 仅 匹配重音元音,但是我不确定如何获取它,因为等价类(例如匹配 所有 e的(带或不带有重音))都可以。 另外

  • 以下模式需要一个组合正则表达式: 其中带数字的分隔符可以是空格()、减号(-)、句点(.),反斜杠(\),等于(=)。一种情况是,一个以上的分隔符(相同或不同类型)不能与任意两位数字同时出现一次以上。 有效号码- 一个有效的输入是,只要没有两个相邻的分隔符,就有16位数字被任意/无分隔符分隔。 我们想出了以下正则表达式: 它与某些模式不匹配。例如: 对于相同的数字,它匹配(如预期的)以下模式: 分

  • 当所有组都是可选的时,我在提取组时遇到了问题。 上下文(如果您愿意,可以跳到结尾):这是在将字符串与一堆正则表达式进行最佳匹配并查看哪个表达式具有最多组匹配的上下文中。 例如,我可能有一个潜在的格式; 但我希望用户打错字,或者不包含空格或其他东西。 所以我可以用绳子测试一下 并希望获得组 一个 光盘 1-1 G 而且,对于测试字符串 我想得到   DE   克 下面是我的正则表达式,用于匹配以下可

  • 问题内容: 我试图返回一个数组或切片,针对字符串针对特定正则表达式的所有匹配项。字符串是: 我想返回一个花括号之间所有字符串都匹配的数组。我尝试使用regexp软件包来完成此操作,但无法弄清楚如何返回我要查找的内容。这是我当前的代码: 但是,无论我尝试什么,每次返回的结果都是一片空白。 问题答案: 首先,您不需要正则表达式定界符。其次,使用原始字符串文字定义一个正则表达式模式是个好主意,您只需要使