You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现主字典关键词与拆分格式文本的精准匹配问题

解决方案

要搞定这个问题,核心是要精准匹配被空格拆分但未被其他字符包裹的完整关键词——之前直接移除所有空格再匹配的方法,会把嵌在其他单词里的关键词也误判,所以我们得用正则表达式的断言机制来实现精准定位。

核心思路

  1. 为每个关键词生成专属正则模式:

    • 允许关键词的每个字符之间插入任意数量的空格(包括零个)
    • 用(?<!\w)和(?!\w)这两个负向断言,确保关键词前后没有字母/数字字符(彻底避免关键词被其他单词包裹的情况)
    • 加上(?i)标记,让匹配忽略大小写,适配文本中关键词的大小写变化
  2. 遍历每条文本,用每个关键词的正则模式逐一匹配,收集所有匹配成功的关键词

  3. 若没有匹配到任何关键词,返回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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 10:28:16