\w+和[a-zA-Z]+的区别,正则表达式输出出错

在写代码时候如下代码段:m这里使用正则表达式 \d+ 来检查 i 中是否含有一个或多个数字。

正则表达式 \w+ 用于检查 i 中是否含有一个或多个字母、数字或下划线字符。

word_list=jieba.cut(strs,cut_all=True)
new_words=[]
    for i in word_list:
        # print(i)
        m=re.search("\d+",i)
        n=re.search("\w+",i)
        if not m and not n and len(i)>1:
            new_words.append(i)
    print(new_words)

预期输出: 

实际输出:

解决方法:将'\w+'改为'[a-zA-Z]+' 

word_list=jieba.cut(strs,cut_all=True)
new_words=[]
    for i in word_list:
        # print(i)
        m=re.search("\d+",i)
        n=re.search("[a-zA-Z]+",i) 
        if not m and not n and len(i)>1:
            new_words.append(i)
    print(new_words)

 分析原因:

\w+

  • 匹配范围\w 匹配任何单字字符(alphanumeric character),通常包括所有字母和数字以及下划线(_)。具体来说,\w 等价于 [a-zA-Z0-9_]
  • Unicode:在默认情况下(没有指定 Unicode 标志),\w 仅匹配 ASCII 字符。然而,如果在 Python 的正则表达式中启用了 Unicode 标志(通过在正则表达式中加上 re.Ure.UNICODE),\w 也可以匹配 Unicode 字符集中的字母和数字,这包括了许多非英语的字符,如中文、日本、韩国等文字。

[a-zA-Z]+

  • 匹配范围:这个表达式明确地只匹配从 'a' 到 'z' 以及从 'A' 到 'Z' 的英文字母,因此它不包括数字和下划线或任何非英文字母字符。
  • 非Unicode特定:使用 [a-zA-Z] 不受 Unicode 标志的影响,因为它明确指定了要匹配的字符集。它不会误匹配任何数字或特殊字符,也不包括任何非ASCII的字母字符。

在我的场景中,我的目标是从分词结果中排除任何含有数字或英文字符的词,而保留纯中文词汇。由于 \w+ 在某些配置下可能误将中文字符视为 word character(尤其是在 Unicode 模式下),它可能会导致所有包含中文的词都被错误地过滤掉。而 [a-zA-Z]+ 仅针对英文字符,因此不会影响中文字符的匹配,确保那些仅包含中文的词被正确保留。

在 Python 中,\w 是否将中文视为 word character 主要取决于正则表达式的编译标志和 Python 版本的默认行为。在 Python 的早期版本(Python 2),正则表达式不默认采用 Unicode-aware 模式,而在 Python 3 中,正则表达式默认已经是 Unicode-aware 的,这意味着 \w\b\s 等模式自动支持 Unicode 字符(包括中文)。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值