正则表达式负前瞻,用于将字符串与任何非中文UTF字符匹配

2024-10-01 19:24:25 发布

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

意图

创建一个正则表达式,该正则表达式在存在任何字符(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]+)*

测试用例

Case预期结果

大家好0个匹配项

00你是谁>=1场比赛

s%%2>=1场比赛

你Привет>=1场比赛

谢谢您抽出时间


Tags: 字符utfu4e00u9fffu2a6dfu2a700u2ceafu4bdf
1条回答
网友
1楼 · 发布于 2024-10-01 19:24:25

首先,\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]

有两种解决问题的方法:

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

    is_just_han = re.search("^[...]*$", str)     # or regex.search
    
  2. 字符串是否包含该类之外的字符

    is_just_han = not re.search("[^...]", str)   # or regex.search
    

如果使用regex模块而不是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)

相关问题 更多 >

    热门问题