如何用Python构建正则查找指定间隔内任意顺序的多个关键词
解决方案
你要的效果完全不需要写复杂的排列组合正则,用滑动窗口法实现更简单易维护,效率也更高,具体实现如下:
实现步骤
- 先把文本统一转小写(如果需要大小写敏感可以去掉转小写逻辑),拆分成独立的单词列表
- 计算匹配需要的滑动窗口大小:按照你给出的规则,
n个关键词的总允许间隔为3*(n-1),因此窗口总长度为关键词数量 + 3*(n-1),刚好满足你的要求:2个关键词窗口长度5、3个关键词窗口长度9、4个关键词窗口长度13,你也可以根据需求自行调整窗口计算规则 - 遍历所有长度等于窗口大小的连续单词片段,检查是否包含所有目标关键词,存在符合条件的片段就返回True
代码示例
import re def check_keywords_in_range(sentence: str, keywords: list, max_interval_per_gap: int =3) -> bool: # 拆分所有单词,转小写实现大小写不敏感匹配 words = re.findall(r'\b\w+\b', sentence.lower()) keyword_set = set(k.lower() for k in keywords) n = len(keyword_set) if n == 0: return True # 计算窗口大小:关键词数 + 总允许间隔 window_size = n + max_interval_per_gap * (n - 1) # 句子总词数不足窗口大小直接返回False if len(words) < window_size: return False # 滑动窗口遍历所有可能的片段 for i in range(len(words) - window_size + 1): window_words = set(words[i:i+window_size]) if keyword_set.issubset(window_words): return True return False # 测试用例1 sentence1 = 'this and that' keywords1 = ['this', 'that'] print(check_keywords_in_range(sentence1, keywords1)) # 输出True # 测试用例2:4个关键词场景 sentence2 = 'this is a test that these are those demo content' keywords2 = ['this', 'that', 'these', 'those'] print(check_keywords_in_range(sentence2, keywords2))
原代码问题说明
你之前写的代码有两个明显错误导致无法正常运行:
- 正则字符串没有加
r前缀,\b会被Python解析为退格符,而非正则规则里的单词边界 - 正则字符串里直接写了
word1、word2变量名,不会被自动替换为变量的实际值,需要用f-string或者字符串拼接传入变量值
内容的提问来源于stack exchange,提问作者PracticingPython
相关产品推荐
相关产品推荐

