正则表达式提取文本词汇生成列表:结果冗余问题求解
问题解决:从文本列表中提取指定风险词汇并生成目标列表
需求与问题现状
需求:使用正则表达式从文本列表中提取属于hazards_set集合的词汇并生成符合要求的列表。
原代码
myList = [] text = ["salmonella in black pepper from brazil", "aflatoxins in fish from germany", "pseudomonas in meat from italy"] findmatches = re.compile(r"\b" + r"\b|\b".join(re.escape(hazard) for hazard in hazards_set) + r"\b") for i in text: for possible_match in set(findmatches.findall(i)): if possible_match in hazards_set: myList.append(possible_match) myList.append("") print(myList)
当前输出
['salmonella', '', 'aflatoxins', '', '']
期望输出
['salmonella','aflatoxins', '']
(注:pseudomonas不在hazards_set中,因此该条文本不应产生空字符串)
问题原因
原代码中,无论当前文本是否匹配到目标词汇,都会在循环末尾执行myList.append(""),导致第三条无匹配的文本也追加了空字符串,最终结果多了一个不必要的空值。
解决方案
只在当前文本成功匹配到目标词汇时,才追加空字符串。以下提供两种实现方式:
方式一:使用标志位判断
import re myList = [] text = ["salmonella in black pepper from brazil", "aflatoxins in fish from germany", "pseudomonas in meat from italy"] # 根据示例推断的hazards_set内容 hazards_set = {"salmonella", "aflatoxins"} # 构建匹配正则 findmatches = re.compile(r"\b" + r"\b|\b".join(re.escape(hazard) for hazard in hazards_set) + r"\b") for line in text: has_match = False # 遍历去重后的匹配结果 for possible_match in set(findmatches.findall(line)): if possible_match in hazards_set: myList.append(possible_match) has_match = True # 仅当有匹配时才追加空字符串 if has_match: myList.append("") print(myList)
方式二:简化匹配逻辑
通过正则直接匹配目标词汇,减少冗余判断,代码更简洁:
import re myList = [] text = ["salmonella in black pepper from brazil", "aflatoxins in fish from germany", "pseudomonas in meat from italy"] hazards_set = {"salmonella", "aflatoxins"} # 用非捕获分组优化正则结构 pattern = re.compile(r"\b(?:{})\b".format("|".join(re.escape(h) for h in hazards_set))) for line in text: # 获取当前行的所有匹配项 matches = pattern.findall(line) # 去重后若有结果则添加到列表,并追加空字符串 if matches: myList.extend(list(set(matches))) myList.append("") print(myList)
最终输出
两种方式运行后均会得到期望结果:
['salmonella','aflatoxins', '']
内容的提问来源于stack exchange,提问作者Davide
相关产品推荐
相关产品推荐

