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

如何用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))

原代码问题说明

你之前写的代码有两个明显错误导致无法正常运行:

  1. 正则字符串没有加r前缀,\b会被Python解析为退格符,而非正则规则里的单词边界
  2. 正则字符串里直接写了word1、word2变量名,不会被自动替换为变量的实际值,需要用f-string或者字符串拼接传入变量值

内容的提问来源于stack exchange,提问作者PracticingPython

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 23:09:04