Python实现主字典关键词与拆分格式文本的精准匹配问题
解决方案
要搞定这个问题,核心是要精准匹配被空格拆分但未被其他字符包裹的完整关键词——之前直接移除所有空格再匹配的方法,会把嵌在其他单词里的关键词也误判,所以我们得用正则表达式的断言机制来实现精准定位。
核心思路
为每个关键词生成专属正则模式:
- 允许关键词的每个字符之间插入任意数量的空格(包括零个)
- 用
(?<!\w)和(?!\w)这两个负向断言,确保关键词前后没有字母/数字字符(彻底避免关键词被其他单词包裹的情况) - 加上
(?i)标记,让匹配忽略大小写,适配文本中关键词的大小写变化
遍历每条文本,用每个关键词的正则模式逐一匹配,收集所有匹配成功的关键词
若没有匹配到任何关键词,返回
NA
完整代码实现
import pandas as pd import re def matcher(x, word_dict): matches = [] # 先对关键词去重,避免重复匹配 unique_words = list(dict.fromkeys(word_dict)) for keyword in unique_words: # 构建正则模式:转义特殊字符+字符间允许任意空格+前后非单词字符+忽略大小写 pattern = r'(?i)(?<!\w)' + r'\s*'.join(re.escape(c) for c in keyword) + r'(?!\w)' if re.search(pattern, x): matches.append(keyword) # 有匹配则用下划线拼接,无匹配返回NA return '_'.join(matches) if matches else 'NA' # 测试数据集 df = pd.DataFrame( {'ID' : ['1', '2', '3', '4','5'], 'Text' : ['sample 123 45 678 text','sample as123456 text','sample As123 456','sample bas123456 text','sample bas123 456ts text']}, columns = ['ID','Text'] ) master_dict= pd.DataFrame({'Keyword' : ['12345678','as123456']}, columns = ['Keyword']) # 应用匹配函数到文本列 df['Match'] = df['Text'].apply(lambda x: matcher(x, master_dict.Keyword)) print(df)
输出结果验证
运行代码后,输出和你的预期完全一致:
ID Text Match 0 1 sample 123 45 678 text 12345678 1 2 sample as123456 text as123456 2 3 sample As123 456 as123456 3 4 sample bas123456 text NA 4 5 sample bas123 456ts text NA
细节说明
re.escape(c):用来转义关键词中的正则特殊字符(比如.、*这类符号),避免它们被当作正则语法处理(?<!\w)和(?!\w):确保关键词的前后不是字母或数字,彻底排除了bas123456里的as123456、bas123 456ts里的as123 456这类误匹配情况(?i):让正则匹配忽略大小写,所以文本里的As123 456也能匹配到字典里的as123456
内容的提问来源于stack exchange,提问作者MJ17
相关产品推荐
相关产品推荐

