Python实现Excel跨表标题与关键词匹配并返回具体命中关键词
核心改造思路
原实现用any()把匹配结果数组压成了纯布尔值,本质上匹配过程已经可以定位到所有命中的关键词,只需要把被any()吞掉的匹配结果保留下来,不需要改动核心匹配规则。
具体调整点
- 取消
any()的结果压平逻辑,保留列表推导中所有满足匹配条件的关键词 - 提前对关键词做格式归一(转小写、去空值、按需筛选激活状态),和标题分词后的小写规则对齐,避免漏匹配
- 同时保留原有布尔值判断列,不破坏原有逻辑的兼容性
- 将标题分词结果转为集合结构,降低逐词匹配的性能开销
注意:原代码存在大小写匹配偏差:标题分词后统一转成了小写,但关键词列表没有做同样的归一化处理,比如关键词为“Running Shoes”、标题中为“running shoes”时,原逻辑会判定不匹配,改造时会统一处理格式对齐
改造后完整代码
import pandas as pd import re file_path ='C:/Users/User/Desktop/data.xlsx' def get_keyword(file_path): """ 获取「Keyword list」工作表中有效(ACTIVE?列为有效状态)的KEYWORD值,转成列表 """ df = pd.read_excel(file_path, sheet_name='Keyword list') # 对齐原注释逻辑:仅保留激活状态的关键词,可根据实际单元格值调整筛选规则 active_df = df[df['ACTIVE?'].astype(str).str.lower().isin(['yes', 'true', '1'])] # 关键词归一化:去首尾空格、转小写、过滤空值 keywords = [ str(kw).strip().lower() for kw in active_df['KEYWORD'].to_list() if str(kw).strip() != '' ] return keywords keyword_list = get_keyword(file_path) def words(phrase: str) -> [str]: """ 按非字母/数字字符拆分字符串为单词列表,统一转小写 """ return list(map(lambda x: x.lower(), filter(len, re.split(r'\W', phrase)))) def compare_title(file_path): """ 读取「Product content」工作表的TITLE列,逐行返回匹配到的关键词列表、匹配状态 """ df = pd.read_excel(file_path, sheet_name='Product content') df = df.fillna('-') def get_matched_keywords(title_str): # 转集合后查找效率远高于列表,不影响匹配准确性 title_words = set(words(title_str)) # 保留所有命中的关键词,不再压成布尔值 matched_kws = [kw for kw in keyword_list if kw in title_words] return matched_kws # 新增两列:匹配关键词列表、原逻辑的布尔值判断 df['matched_keywords'] = df['TITLE'].apply(get_matched_keywords) df['is_matched'] = df['matched_keywords'].apply(lambda x: len(x) > 0) return df
输出效果说明
- 调用
compare_title()后会返回完整的产品内容表,新增两列内容 matched_keywords列:逐行展示该标题下命中的所有有效关键词,无匹配时返回空列表is_matched列:和原函数返回的布尔值逻辑完全一致,可直接复用原有判断逻辑- 匹配规则没有改动,和原有校验标准完全对齐
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

