Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.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 Regex-负前瞻,用于将字符串与任何非中文UTF字符匹配 意图_Python_Python 3.x_Regex_Regex Lookarounds - Fatal编程技术网

Python Regex-负前瞻,用于将字符串与任何非中文UTF字符匹配 意图

Python Regex-负前瞻,用于将字符串与任何非中文UTF字符匹配 意图,python,python-3.x,regex,regex-lookarounds,Python,Python 3.x,Regex,Regex Lookarounds,创建一个正则表达式,该正则表达式在存在任何字符(ASCII、Unicode或其他字符)时创建匹配,这些字符不属于任何有效的汉字UTF-8范围。匹配本身并不重要,而是存在非中文字符。请注意,UTF-8字符集中还存在罕见的、未使用的汉字。当不存在匹配项时,该函数返回None,从而表明传入的字符串是调用方函数的纯Unicode中文字符串 代码 Python 3.8 chineseRegexSet = "[\u4E00-\u9FFF]|[\u3400-\u4BDF]|[\u20000-\u2A

创建一个正则表达式,该正则表达式在存在任何字符(ASCII、Unicode或其他字符)时创建匹配,这些字符不属于任何有效的汉字UTF-8范围。匹配本身并不重要,而是存在非中文字符。请注意,UTF-8字符集中还存在罕见的、未使用的汉字。当不存在匹配项时,该函数返回None,从而表明传入的字符串是调用方函数的纯Unicode中文字符串

代码 Python 3.8

chineseRegexSet = "[\u4E00-\u9FFF]|[\u3400-\u4BDF]|[\u20000-\u2A6DF]|[\u2A700-\u2B73F]|[\u2B740-\u2B81F]|[\u2B820-\u2CEAF]|[\uF900-\uFAFF]|[\u2F800-\u2FA1F]"
def ContainsNonChineseCharacters(hanziWord):
    #negative lookahead
    match = search("(?!" + chineseRegexSet + ")+", hanziWord)
    if match:
        if _DEBUG:
            PrintDebugError(hanziWord)
            PrintDebugError(hanziWord, utfEncode=True)
    else:
        _LOGGER.debug(hanziWord)
        if _DEBUG:
            PrintDebug(hanziWord)
            PrintDebug(hanziWord, utfEncode=True)

    return match
尝试的正则表达式解决方案 解释:任何非汉字负号。前瞻设置,至少一次

(?![\u4E00-\u9FFF]|[\u3400-\u4BDF]|[\u20000-\u2A6DF]|[\u2A700-\u2B73F]|[\u2B740-\u2B81F]|[\u2B820-\u2CEAF]|[\uF900-\uFAFF]|[\u2F800-\u2FA1F])+
解释:任何UTF集合中的任何非单数汉字

(?![\u4E00-\u9FFF]+|[\u3400-\u4BDF]+|[\u20000-\u2A6DF]+|[\u2A700-\u2B73F]+|[\u2B740-\u2B81F]+|[\u2B820-\u2CEAF]+|[\uF900-\uFAFF]+|[\u2F800-\u2FA1F]+)*
测试用例
案例
预期结果

大家好0个匹配项

00你是谁>=1匹配项

s%%2
>=1匹配

你Пццццц
>=1匹配


谢谢您抽出时间

首先,
\u20000
并不意味着你认为它有什么作用。因为
\u
序列的长度必须正好是4位,这是指
u+2000
和数字
0
。对于0xFFFF以上的字符,Python提供了
\U
,后面必须紧跟8位数字(例如
\U00020000


第二,

[A-B]|[C-D]|...
最好写为

[A-BC-D...]

通过上述修复和上述简化,我们有:

[\u3400-\u4BDF\u4E00-\u9FFF\uF900-\uFAFF\U00020000-\U0002A6DF\U0002A700-\U0002B73F\U0002B740-\U0002B81F\U0002B820-\U0002CEAF\U0002F800-\U0002FA1F]

有两种解决问题的方法:

  • 字符串是否仅包含该类中的字符

    是_just_han=re.search(“^[…]*$”,str)还是regex.search
    
  • 字符串是否包含该类之外的字符

    is_just_han=not re.search(“[^…]”,str)#或regex.search
    

  • 如果使用模块而不是re模块,则可以访问
    \p{Han}
    (缩写为
    \p{Script=Han}
    )及其否定
    \p{Han}
    (缩写为
    \p{Script=Han}
    )。此Unicode属性与您尝试匹配的字符非常匹配。我会让你决定它是否适合你

    is_just_han=regex.search(“^\p{han}*$”,str)
    is_just_han=regex.search(“\P{han}”,str)
    
    首先,
    \u20000
    并不意味着你认为它能做什么。因为
    \u
    序列的长度必须正好是4位,这是指
    u+2000
    和数字
    0
    。对于0xFFFF以上的字符,Python提供了
    \U
    ,后面必须紧跟8位数字(例如
    \U00020000


    第二,

    [A-B]|[C-D]|...
    
    最好写为

    [A-BC-D...]
    

    通过上述修复和上述简化,我们有:

    [\u3400-\u4BDF\u4E00-\u9FFF\uF900-\uFAFF\U00020000-\U0002A6DF\U0002A700-\U0002B73F\U0002B740-\U0002B81F\U0002B820-\U0002CEAF\U0002F800-\U0002FA1F]

    有两种解决问题的方法:

  • 字符串是否仅包含该类中的字符

    是_just_han=re.search(“^[…]*$”,str)还是regex.search
    
  • 字符串是否包含该类之外的字符

    is_just_han=not re.search(“[^…]”,str)#或regex.search
    

  • 如果使用模块而不是re模块,则可以访问
    \p{Han}
    (缩写为
    \p{Script=Han}
    )及其否定
    \p{Han}
    (缩写为
    \p{Script=Han}
    )。此Unicode属性与您尝试匹配的字符非常匹配。我会让你决定它是否适合你

    is_just_han=regex.search(“^\p{han}*$”,str)
    is_just_han=regex.search(“\P{han}”,str)
    
    关于
    \P{Script=Han}
    ,我必须做一些广泛的测试,因为我正在解析古代汉语词典,Python正则表达式的加速器可能不支持其中一些范围。虽然我喜欢表达式的简洁,但一旦我弄清楚正则表达式,我一定会尝试一下。使用适当的库,未通过检查的正则表达式之间的差异为.04%,这超过了可接受的错误/差异容忍度。非常感谢@ikegami!关于
    \P{Script=Han}
    ,我必须做一些广泛的测试,因为我正在解析古代汉语词典,Python正则表达式的加速器可能不支持其中一些范围。虽然我喜欢表达式的简洁,但一旦我弄清楚正则表达式,我一定会尝试一下。使用适当的库,未通过检查的正则表达式之间的差异为.04%,这超过了可接受的错误/差异容忍度。非常感谢@ikegami!