如何在字符串列表中实现子串部分匹配,检测目标列表是否包含指定关键词
MX记录关键词匹配功能实现方案
核心实现逻辑
需求本质为子串存在性判定,无需对点号、连字符等域名特殊符号做额外处理,只要MX记录中完整包含任意关键词子串即可判定匹配成功。
- 可选预处理步骤:将所有关键词和MX记录统一转为小写,避免域名大小写差异导致的匹配遗漏
- 遍历所有MX记录,逐个检查是否包含任意目标关键词
- 只要存在任意一对匹配直接返回
True,全部遍历完成无匹配返回False
基础版代码实现(Python)
def check_mx_keyword_match(keywords: list[str], mx_records: list[str], ignore_case: bool = True) -> bool: # 预处理关键词 processed_keywords = [kw.lower() for kw in keywords] if ignore_case else keywords for mx in mx_records: current_mx = mx.lower() if ignore_case else mx # 检查当前MX是否包含任意关键词 for kw in processed_keywords: if kw in current_mx: return True return False # 测试示例 if __name__ == "__main__": test_keywords = ["gmail", "google", "outlook"] test_mx_list = ["mail.protection.outlook.com", "gmail-smtp.google.com"] print(check_mx_keyword_match(test_keywords, test_mx_list)) # 输出结果:True
高并发/大数据量优化方案
如果关键词或MX记录量级超过1000条,普通遍历的O(M*N)时间复杂度(M为MX记录数、N为关键词数)性能较低,可通过AC自动机构建关键词字典树优化,单次匹配复杂度降至O(L)(L为单条MX记录长度),实现示例:
import ahocorasick def optimized_mx_match(keywords: list[str], mx_records: list[str], ignore_case: bool = True) -> bool: # 构建AC自动机 automaton = ahocorasick.Automaton() for idx, kw in enumerate(keywords): processed_kw = kw.lower() if ignore_case else kw automaton.add_word(processed_kw, (idx, processed_kw)) automaton.make_automaton() for mx in mx_records: processed_mx = mx.lower() if ignore_case else mx # 存在任意匹配直接返回 if next(automaton.iter(processed_mx), None) is not None: return True return False
内容的提问来源于stack exchange,提问作者Derik72
相关产品推荐
相关产品推荐

