Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 正则表达式匹配所有韩语(韩语)字符和音节块_Python_Regex_Validation_Character_Alphabet - Fatal编程技术网

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

Python 正则表达式匹配所有韩语(韩语)字符和音节块,python,regex,validation,character,alphabet,Python,Regex,Validation,Character,Alphabet,我试图验证用户输入(Python),看看是否使用了正确的语言,在本例中是韩语。让我们用韩语单词作为电子邮件地址:이메일 주소 我可以这样检查每个字符: import unicodedata as ud for chr in u'이메일 주소': if 'HANGUL' in ud.name(chr): print "Yep, that's a Korean character." 但这似乎效率很低,尤其是对于较长的文本。当然,我可以创建一个包含所有韩国语音节块的静态词典,但该词典将包含

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

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

import unicodedata as ud
for chr in u'이메일 주소':
    if 'HANGUL' in ud.name(chr): print "Yep, that's a Korean character."
但这似乎效率很低,尤其是对于较长的文本。当然,我可以创建一个包含所有韩国语音节块的静态词典,但该词典将包含25000个字符,而且检查起来效率很低。此外,我还需要一个日语和汉语的解决方案,其中可能包含更多的字符

因此,我想使用一个正则表达式模式来覆盖韩语音节块的所有Unicode字符。但我不知道是否有一个范围,或者在哪里可以找到它

例如,此正则表达式模式涵盖所有基于拉丁语的字符,包括括号和其他常用符号:

import re
LATIN_CHARACTERS = re.compile(ur'[\x00-\x7F\x80-\xFF\u0100-\u017F\u0180-\u024F\u1E00-\u1EFF]')
有人能把这个正则表达式翻译成和韩国语韩国语音节块相匹配的吗?或者你能给我一个表格或参考资料来自己查找这些范围吗

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

这里有一个用于该任务的Python库,但它可以与难以置信的大型词典一起使用: 我无法想象这对于大文本和大量用户输入来说是有效的


谢谢

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

有一个单独的代码块,在、a等中有附加字符

最有效的方法是使用
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)
def是朝鲜文字符(char):
''检查字符是否在Hangul Jamo块''
值=ord(字符)

返回值>=4352和值=4352&&c如果您想要一个不依赖于实用程序应用程序的unicode合规性的解决方案,对于AC00-D7AF的主块,您可以使用

(([\352][\260-\277]|[\353\354][\200-\277]|
[\355][\200-\235])[\200-\277]|[\355][\236][\200-\243]) # mawk/gawk -b 
那块板子会膨胀

(\355\236(\200|\201|\202|\203|\204|\205|\206|\207|
\210|\211|\212|\213|\214|\215|\216|\217|\220|\221|
\222|\223|\224|\225|\226|\227|\230|\231|\232|\233|
\234|\235|\236|\237|\240|\241|\242|\243)|
(\352(\260|\261|\262|\263|\264|\265|\266|
\267|\270|\271|\272|\273|\274|\275|\276|\277)|
\355(\200|\201|\202|\203|\204|\205|\206|\207|
\210|\211|\212|\213|\214|\215|\216|\217|\220|
\221|\222|\223|\224|\225|\226|\227|\230|\231|
\232|\233|\234|\235)|(\353|\354)
(\200|\201|\202|\203|\204|\205|\206|\207|\210|
\211|\212|\213|\214|\215|\216|\217|\220|\221|
\222|\223|\224|\225|\226|\227|\230|\231|\232|
\233|\234|\235|\236|\237|\240|\241|\242|\243|
\244|\245|\246|\247|\250|\251|\252|\253|\254|
\255|\256|\257|\260|\261|\262|\263|\264|\265|
\266|\267|\270|\271|\272|\273|\274|\275|\276|
\277))(\200|\201|\202|\203|\204|\205|\206|\207|\210
|\211|\212|\213|\214|\215|\216|\217|\220|\221
|\222|\223|\224|\225|\226|\227|\230|\231|\232
|\233|\234|\235|\236|\237|\240|\241|\242|\243
|\244|\245|\246|\247|\250|\251|\252|\253|\254
|\255|\256|\257|\260|\261|\262|\263|\264|\265
|\266|\267|\270|\271|\272|\273|\274|\275|\276|\277))
如果您需要额外的东西-jamo、兼容性jamo、带圆圈的表单、带括号的表单和半宽度表单,请将此附加到上面的表单

或者

 [\341\204\200-\341\207\277
  \343\204\260-\343\206\217
  \352\245\240-\352\245\277
  \355\236\260-\355\237\277
  \343\200\256-\343\200\257
  \343\210\200-\343\210\236
  \343\211\240-\343\211\276
  \357\276\240-\357\276\276
  \357\277\202-\357\277\207
  \357\277\212-\357\277\217
  \357\277\222-\357\277\227
  \357\277\232-\357\277\234]  # gawk unicode-mode only

如果您只需要组成11172音节系列的现代jamo,那么它会更干净:

((\341)((\204)[\200-\222]|(\205)[\241-\265]|(\206)[\250-\277]|(\207)[\200-\202]))
或者,如果您希望它没有多余的括号:

(\341(\204[\200-\222]|\205[\241-\265]|\206[\250-\277]|\207[\200-\202]))
ps:我只是为了可读性才在这里格式化。在这些八进制代码之间没有任何空格、制表符或新行。这是一个连续的字符串

就我个人而言,我更愿意自己使用干净的现代正则表达式,但是使用这些八进制对于我自己来说是一个必要的缺点,它会使mawk1.3.4和mawk2 beta达到完全的UTF8兼容性

(至少在长度()ordC()SUBSTR()和字符级拆分方面,但在UC13代码点级,加上仅韩语NFD到NFC


但是没有什么比字形集群或双向文本更奇特的了)

那么,基本上,你是说:使用Unicode数据解决方案?谢谢你的详尽答复。我既不是Unicode的专家,也不是CJK语言的专家。@SimonSteinberger或多或少,如果你不太在意效率,
unicodedata
将非常有效。但是如果您需要更高的效率,使用C或Cython,您可以返回bool而不是分配的字符串(就像Python那样)。例如,超过95%的韩语字符位于
U+AC00..U+D7AF
块中,该块来自
44032-55215
。查看上面链接中的相关Unicode块以找到正确的规则,半小时后您将拥有所需的一切。
((\341)((\204)[\200-\222]|(\205)[\241-\265]|(\206)[\250-\277]|(\207)[\200-\202]))
(\341(\204[\200-\222]|\205[\241-\265]|\206[\250-\277]|\207[\200-\202]))