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

正则表达式提取文本词汇生成列表:结果冗余问题求解

问题解决:从文本列表中提取指定风险词汇并生成目标列表

需求与问题现状

需求:使用正则表达式从文本列表中提取属于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:21:00