如何实现句子中单词的模糊匹配并获取起始索引与匹配内容?
解决方案:模糊匹配获取起始索引与匹配内容
原代码的问题在于find()方法仅支持精确匹配,目标单词ANGLO (UK) LTD转小写后是anglo (uk) ltd,而文本中对应的是anglo (uk) limited,两者无法精确匹配,因此find()返回-1,后续调用match.start()还会报错(因为start_idx不是匹配对象)。
要实现模糊匹配(这里是缩写与全称的匹配),可以用正则表达式的re.search()方法,通过构建灵活的匹配规则来实现:
import re body = 'Charles D�Silva | Technical Officer Anglo (UK) Limited' word = 'ANGLO (UK) LTD' # 构建适配缩写的正则模式:转义特殊字符,将LTD替换为可匹配LTD或Limited的规则 pattern = re.compile( re.escape(word.lower()).replace('ltd', r'(limited|ltd)'), re.IGNORECASE ) match_result = pattern.search(body) if match_result: start_index = match_result.start() matched_text = match_result.group() print(f"起始索引:{start_index}") print(f"匹配内容:{matched_text}") else: print("未找到匹配项")
代码说明:
re.escape():转义目标单词中的特殊字符(如括号()),避免被正则解析为语法符号。- 替换
ltd为(limited|ltd):让规则同时匹配缩写LTD和全称Limited。 re.IGNORECASE:忽略大小写,无需手动转换文本大小写。match_result.start():获取匹配内容的起始索引;match_result.group():获取完整的匹配文本。
如果需要更通用的模糊匹配(比如允许字符差异、部分单词匹配),可以调整正则规则,例如拆分单词并允许任意间隔字符:
# 通用模糊匹配:拆分目标单词为独立词,允许词间任意非单词字符 words = word.split() pattern = re.compile(r'\s+'.join([re.escape(w) for w in words]).replace('LTD', r'Limited'), re.IGNORECASE)
内容的提问来源于stack exchange,提问作者Pravin
相关产品推荐
相关产品推荐

