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
相关产品推荐
相关产品推荐

