在写代码时候如下代码段: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.U
或re.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 字符(包括中文)。