
本文介绍多种从字符串中提取连续字母序列(即“单词”)的方法,重点解决非字母字符(如标点、数字、空格等)作为分隔符的问题,并兼顾多语言 unicode 字符(如带重音符号的法语字符)的正确识别。
本文介绍多种从字符串中提取连续字母序列(即“单词”)的方法,重点解决非字母字符(如标点、数字、空格等)作为分隔符的问题,并兼顾多语言 unicode 字符(如带重音符号的法语字符)的正确识别。
在文本处理中,常需从混杂标点、数字和空格的原始字符串中提取“纯单词”——即仅由字母构成的连续子串。例如,对 s = "(This# is an5example!)",期望输出 ['This', 'is', 'an', 'example']。关键在于:以任意非字母字符为边界进行切分,同时确保 Unicode 字母(如 é, ñ, ç)被正确识别。
方法一:基础循环 + str.isalpha()(推荐入门)
最直观的方式是遍历每个字符,累积字母,遇非字母且当前有累积内容时切分:
s = "(This# is an5example!)"
word_list = []
word = ""
for char in s:
if char.isalpha():
word += char
elif word: # 非空且遇到分隔符,保存并重置
word_list.append(word)
word = ""
if word: # 处理末尾未结束的单词
word_list.append(word)
print(word_list) # ['This', 'is', 'an', 'example']
✅ 优点:逻辑清晰、无外部依赖、天然支持 Unicode('français'.isalpha() 返回 True)。
⚠️ 注意:Python 的 isalpha() 基于 Unicode 标准,但对组合字符序列(如 franc\u0327ais,即 c + 组合变音符 ◌̧)可能返回 False,因其未归一化。生产环境建议先 unicodedata.normalize('NFC', s)。
方法二:正则表达式(简洁高效)
使用 re.findall() 直接匹配连续字母序列:
import re s = "(This# is an5example!)" words = re.findall(r'[a-zA-Z]+', s) # 仅 ASCII 字母 print(words) # ['This', 'is', 'an', 'example']
若需支持所有 Unicode 字母(含法语、西语等),改用 \p{L}(需 regex 模块,非标准 re):
# pip install regex
import regex # 注意:不是标准库的 re
s = "(Café naïve résumé!)"
words = regex.findall(r'\p{L}+', s) # \p{L} 匹配任意 Unicode 字母
print(words) # ['Café', 'naïve', 'résumé']
✅ 优点:代码极简、性能好;regex 模块的 \p{L} 严格遵循 Unicode 字母定义,比 isalpha() 更鲁棒。
⚠️ 注意:标准 re 不支持 \p{L},必须使用第三方 regex 库。
方法三:re.split() + 过滤(灵活可控)
用非字母字符分割,再过滤空字符串:
import re s = "(This# is an5example!)" # 用非字母字符分割,保留非空结果 words = [w for w in re.split(r'[^a-zA-Z]+', s) if w] print(words) # ['This', 'is', 'an', 'example']
同样可升级为 Unicode 版本(配合 regex):
import regex
words = [w for w in regex.split(r'\P{L}+', s) if w] # \P{L} = 非字母
总结与选型建议
- 快速原型/ASCII 场景:用 re.findall(r'[a-zA-Z]+', s) 最简洁;
- 多语言生产环境:优先选用 regex.findall(r'\p{L}+', s),并确保输入已 NFC 归一化;
- 避免依赖第三方库:使用 isalpha() 循环法,但务必添加 unicodedata.normalize('NFC', s) 预处理;
- 永远记得:空字符串过滤(if word 或列表推导式过滤)和结尾单词处理,否则可能遗漏末尾单词或产生空项。
通过以上方法,你可稳健、准确地从任意字符串中提取符合语言习惯的“纯单词”,为后续 NLP 或数据清洗任务打下坚实基础。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











