首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regex -负查找以匹配任何非中文UTF字符的字符串。

问Regex -负查找以匹配任何非中文UTF字符的字符串。
EN

Stack Overflow用户
提问于 2020-12-28 04:29:29
回答 1查看 130关注 0票数 0

意图

若要创建一个正则表达式,在有任何字符、ASCII、Unicode或其他字符时创建匹配,该正则表达式不属于任何有效的中文字符UTF-8范围。比赛本身并不重要,而是非汉字的存在。请注意,在UTF-8字符集中存在罕见的、未使用的汉字也是有意的。函数在没有匹配时返回None,因此指示传入的字符串是纯Unicode中文给调用方函数。

代码

Python 3.8

代码语言:javascript
复制
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

Regex解决方案

Interpretation:任何非中文字符都可以。前瞻性设置,至少一次

代码语言:javascript
复制
(?![\u4E00-\u9FFF]|[\u3400-\u4BDF]|[\u20000-\u2A6DF]|[\u2A700-\u2B73F]|[\u2B740-\u2B81F]|[\u2B820-\u2CEAF]|[\uF900-\uFAFF]|[\u2F800-\u2FA1F])+

Interpretation:来自任意UTF集的任何非奇异汉字

代码语言:javascript
复制
(?![\u4E00-\u9FFF]+|[\u3400-\u4BDF]+|[\u20000-\u2A6DF]+|[\u2A700-\u2B73F]+|[\u2B740-\u2B81F]+|[\u2B820-\u2CEAF]+|[\uF900-\uFAFF]+|[\u2F800-\u2FA1F]+)*

测试用例

Case预期结果

大家好 0匹配

00你是谁 >=1匹配

s%%2 >=1匹配

你Привет >=1匹配

谢谢你抽出时间!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-28 04:37:14

首先,\u20000并不是你所认为的那样。因为\u序列必须有4位长,这是指U+2000和数字0。对于0xFFFF以上的字符,Python提供\U,它必须后面紧跟8位数字(例如\U00020000)。

第二,

代码语言:javascript
复制
[A-B]|[C-D]|...

最好写成

代码语言:javascript
复制
[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) #或regex.search
  2. 字符串是否包含来自该类外部的字符? is_just_han =非re.search(“^.”,str) #或regex.search

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

代码语言:javascript
复制
is_just_han = regex.search("^\p{Han}*$", str)

is_just_han = regex.search("\P{Han}", str)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65473021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档