Sim*_*ger 4 python regex validation character alphabet
我正在尝试验证用户输入(在 Python 中)并查看是否使用了正确的语言,在本例中为韩语。让我们以韩语单词表示电子邮件地址: \xec\x9d\xb4\xeb\xa9\x94\xec\x9d\xbc \xec\xa3\xbc\xec\x86\x8c
\n\n我可以像这样检查每个字符:
\n\nimport unicodedata as ud\nfor chr in u\'\xec\x9d\xb4\xeb\xa9\x94\xec\x9d\xbc \xec\xa3\xbc\xec\x86\x8c\':\n if \'HANGUL\' in ud.name(chr): print "Yep, that\'s a Korean character."\n
Run Code Online (Sandbox Code Playgroud)\n\n但这似乎效率很低,尤其是对于较长的文本。当然,我可以创建一个包含所有韩语音节块的静态字典,但该字典将包含大约 25,000 个字符,而且检查起来效率很低。另外,我还需要一个针对日语和中文的解决方案,其中可能包含更多字符。
\n\n因此,我想使用涵盖 Hangul 音节块的所有 Unicode 字符的正则表达式模式。但我不知道是否有一个范围或在哪里可以找到它。
\n\n例如,此正则表达式模式涵盖所有基于拉丁语的字符,包括括号和其他常用符号:
\n\nimport re\nLATIN_CHARACTERS = re.compile(ur\'[\\x00-\\x7F\\x80-\\xFF\\u0100-\\u017F\\u0180-\\u024F\\u1E00-\\u1EFF]\')\n
Run Code Online (Sandbox Code Playgroud)\n\n有人可以翻译这个正则表达式以匹配韩文韩文音节块吗?或者您可以向我展示一个表格或参考来自己查找此类范围吗?
\n\n匹配中文和日文的模式也会非常有帮助。或者使用一个正则表达式来一次匹配所有 CJK 字符。我不需要区分日语和韩语。
\n\n这里有一个用于该任务的 Python 库,但它可以与非常大的字典一起使用:https://github.com/EliFinkelshteyn/alphabet- detector \n我无法想象这对于大型文本和大量用户输入来说是有效的。
\n\n谢谢!
\n您知道 Unicode 如何分成块,以及每个块如何表示连续的代码点范围?IE,有比正则表达式更有效的解决方案。
Hangul Jamo有一个单一的代码块,其中包含CJK 块中的附加字符、兼容性块、Hangul 音节等。
最有效的方法是使用if/then
语句检查每个字符是否在可接受的范围内。您几乎肯定可以使用 C 扩展来加快速度。
例如,如果我只是检查 Hangul 块(不够,只是一个简单的起始位置),我将使用以下代码检查字符串中的每个字符:
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)
Run Code Online (Sandbox Code Playgroud)
很容易将其扩展到包含朝鲜文字符的8 个左右的块。没有表查找,没有正则表达式编译。只是基于 Unicode 字符块的快速范围检查。
在 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)
Run Code Online (Sandbox Code Playgroud)
编辑粗略地浏览一下 CPython 实现就会发现 CPython 对unicodedata模块使用了这种确切的方法。IE,尽管自己实现它相对容易,但它很有效。它仍然值得实现,因为您不必分配任何中间字符串,或使用多余的字符串比较(这可能是该unicodedata
模块的主要成本)。