Python DataFrame文本处理:如何仅匹配完整独立单词?
问题说明
当前脚本使用Python原生的in运算符做子串包含判断,只要word5是Description字段内容的子串就会触发匹配,因此word5555这类包含word5片段的长字符串也会被判定为命中,不符合你需要「仅匹配完整独立单词」的要求。
解决方案
要实现独立单词的精准匹配,可以借助正则表达式的单词边界规则实现,不需要修改原有类标签拼接的逻辑,仅替换匹配判断的部分即可。
实现步骤
- 导入Python内置的正则表达式标准库
re,无需额外安装依赖:import re - 用正则的单词边界标记
\b构造匹配规则:\b会标记单词的前后分界位置,只有当待匹配词的前后是「非单词字符(空格、标点、句首/句尾)」时才会判定为命中,像word5555中word5的后面是数字(属于单词字符),就不会满足边界匹配条件。 - 用
re.escape()处理待匹配的单词,避免单词中存在正则特殊字符时出现匹配异常。
调整后完整代码
import re import pandas as pd word_list = ['word1', 'word2', 'word3', 'word4'] word_list1 = ['word5'] classe = [] for i in range(0, df.shape[0]): classe.append('') # 提前将当前行的描述文本转小写缓存,减少重复计算 desc_content = df["Description"][i].lower() # 匹配word_list对应Classe1的逻辑,替换为完整单词匹配 for item in word_list: # 构造带单词边界的匹配规则 match_rule = r'\b' + re.escape(item.lower()) + r'\b' if re.search(match_rule, desc_content): if classe[i] != ('') and classe[i] != ('Classe1'): classe[i] = classe[i] + ' \\ ' + 'Classe1' else: classe[i] = 'Classe1' # 匹配word_list1对应Classe2的逻辑,替换为完整单词匹配 for item in word_list1: match_rule = r'\b' + re.escape(item.lower()) + r'\b' if re.search(match_rule, desc_content): if classe[i] != ('') and classe[i] != ('Classe2'): classe[i] = classe[i] + ' \\ ' + 'Classe2' else: classe[i] = 'Classe2'
匹配效果说明
- 以下场景会正常触发匹配:
word5、hello word5 world、word5!、(word5) - 以下场景不会触发匹配:
word5555、myword5、word5_test、aword5b
内容的提问来源于stack exchange,提问作者S2J
相关产品推荐
相关产品推荐

