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

Python从句子提取空格分隔指定词 解决子串误匹配问题

原有代码问题说明

原实现的核心错误有两处:

  • 直接使用in做子串包含判断,没有做完整词边界校验,直接导致短词esk匹配到eskimo的子串、sta匹配到stands的子串,出现误判
  • 后半段判断逻辑完全颠倒:既没有正确使用正则词边界规则(把\b当普通字符串拼接,根本不会触发词边界匹配效果),还反过来判断输入拆分后的单词是否被词条包含,完全不符合匹配需求,还会引入额外误判
正确实现方案

使用正则词边界元字符\b做全字匹配即可满足规则:

  • 匹配前统一转小写,保留原代码大小写不敏感的匹配逻辑
  • 对每个待匹配词条,先转义其中的正则特殊字符(比如列表里带括号、加号、中括号的长化学名词条,避免触发正则语法错误)
  • 给词条前后包裹词边界标记,确保匹配到的内容是完整独立的词条/连续词组,不会匹配长单词内的子串
  • 去掉不必要的set去重逻辑,原词条列表无重复项,直接按原顺序返回匹配结果即可
修改后可直接运行的代码
import re

x1 = ['esk','wild man','eskimo', 'sta','(+)-6-[amina(4-chlora)(1-metha-1h-imidol-5-yl)mhyl]-4-(3-chlora)-1-methyl-2(1h)-quinoa']

def get_name(input_str):
    prod_name = []
    input_processed = input_str.lower().strip()
    for entry in x1:
        entry_processed = entry.strip().lower()
        # 构造全字匹配正则
        match_pattern = re.compile(r'\b' + re.escape(entry_processed) + r'\b')
        if match_pattern.search(input_processed):
            prod_name.append(entry)
    return prod_name

# 测试用例验证
test_sentence = "eskimo lives as a wild man in wild jungle and he stands as a guard"
print(get_name(test_sentence))
# 输出结果:['eskimo', 'wild man'],完全符合预期
匹配效果验证
  • 不会将eskimo中的子串esk判定为匹配,因为esk后紧跟字符i,不满足词边界要求
  • 不会将stands中的子串sta判定为匹配,因为sta后紧跟字符n,不满足词边界要求
  • 可以正确匹配连续多词词条wild man,不会将单独出现的wild或man判定为该词条的匹配
  • 若句子中出现列表里的长化学名词条,也能正确识别,不会因特殊字符出现匹配错误

内容的提问来源于stack exchange,提问作者usr_lal123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 00:01:05