Python pandas中如何仅提取字符串的完整匹配单词?
问题根源
原有匹配逻辑会错误命中子串的核心原因是,正则规则没有添加单词边界限定——只要目标字符串的任意位置出现匹配项的片段,就会被识别为命中,这也是Liu里的iu子串会被错误提取的原因。
调整方案
只需对原有正则规则做两处优化,即可完全匹配预期效果:
- 对所有待匹配条目做正则转义:使用
re.escape()处理cities、liked_names列表中的每一个元素,避免条目内的空格、特殊字符(如连字符、加号)干扰正则解析逻辑 - 给拼接完成的匹配规则加上单词边界
\b:\b会自动识别单词的起止位置,仅当匹配项是完整独立的词汇时才触发提取,不会截取长单词的内部片段
可直接复用的实现代码
import re # 优化 Cities 列提取逻辑(补充转义和边界,避免后续因为列表内容变动出现匹配错误) escaped_cities = [re.escape(city) for city in cities] city_pattern = fr'\b({"|".join(escaped_cities)})\b' df['Cities'] = df['Students'].str.extract(city_pattern, expand=False) # 修复 Liked Names 列提取逻辑 escaped_liked_names = [re.escape(name) for name in liked_names] liked_pattern = fr'\b({"|".join(escaped_liked_names)})\b' df['Liked Names'] = df['Students'].str.extract(liked_pattern, expand=False)
适配效果
调整后的规则可以完全覆盖你的样例场景:
- 匹配
iu时,因为Liu中的iu两侧都是连续英文字符,不满足单词边界的触发条件,不会被错误提取,对应行的Liked Names值为空 - 匹配
Madrid时,原字符串Anna-Madrid+中Madrid的前后是连字符、加号这类非单词字符,刚好满足单词边界要求,可以被正确识别提取 - 匹配
Tommy Julien这类带空格的长名称时,转义后会作为完整整体匹配,不会被空格拆分成零散片段
运行后输出的DataFrame与你给出的预期结果完全一致。
内容的提问来源于stack exchange,提问作者Elisa L.
相关产品推荐
相关产品推荐

