正则表达式是文本分词与统计中最灵活、最可控的底层工具,无需第三方库即可精准定义“词”,适用于英文连字符、缩写、数字混合及中文字符提取,核心方法为re.findall()配合合理模式。

正则表达式是文本分词与统计中最灵活、最可控的底层工具。它不依赖第三方库,能精准定义“什么是词”,尤其适合处理英文中带连字符、缩写、数字混合等复杂情况,也适用于清洗后提取中文字符或特定模式。
用正则提取有效词元(token)
核心是 re.findall() 配合合理模式,直接跳过空格分割的局限性。
-
基础英文单词:使用
r'\b[a-z]+\b'匹配纯字母单词(\b确保边界,避免匹配子串) -
保留连字符词:如
"state-of-the-art"或"e-mail",用r'\b[a-z]+(?:-[a-z]+)*\b' -
兼容缩写和所有格:例如
"U.S.A."或"it's",可扩展为r"\b(?:[a-zA-Z]+(?:'[st]|-[a-zA-Z]+)*)+\b"(需按需调整) -
中文字符提取:用
r'[\u4e00-\u9fff]+'批量抓取连续汉字,适合预处理阶段粗粒度过滤
清洗 + 分词一步到位
不必先 replace 再 split,正则可边清理边切分。
- 把标点全换成空格再 split 容易产生空字符串;而
re.findall(r'\w+', text)直接跳过所有非字母数字字符,天然规避空项 - 想保留部分符号(如连字符、单引号),就明确排除其他标点:
text = re.sub(r'[^\w\s\'-]', ' ', text)→ 再用.split()更安全 - 更健壮的做法是直接匹配目标单元:
words = re.findall(r'\b\w+(?:[-\']\w+)*\b', text.lower())—— 一次完成归一化、清洗、切分
配合 Counter 做高频统计
拿到词列表后,统计本身极简,重点在前期正则是否准确捕获了语义单元。
- 过滤掉无意义短词(如长度
words = [w for w in words if len(w) > 1] - 用
collections.Counter快速计数:from collections import Counter<br> freq = Counter(words)
- 获取前 N 高频:
freq.most_common(10) - 注意:若需去停用词,应在
Counter前过滤,而非后筛——避免无效计数
常见陷阱与应对
正则强大,但写错模式反而引入噪声。
-
过度匹配:如
r'\w+'会把"123abc"当作一个词 → 改用r'[a-zA-Z]+'限定纯字母 -
忽略大小写影响:务必在
findall前统一转小写,或加re.IGNORECASE标志 -
Unicode 边界问题:英文
\b对中文无效,提取中文时改用r'[\u4e00-\u9fff]{2,}'限定最小长度更稳妥 -
性能提醒:对超大文本,避免在循环里反复编译正则;用
re.compile(pattern)预编译提升效率











