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

Python带*通配符(前字符0/1次)的子串匹配:优化多循环、降时间复杂度

通配符匹配函数优化方案

原实现的核心问题

现在的代码有两个躲不开的硬伤:

  • 碰到子串里多个*就直接失效:代码只会用index()找到第一个*的位置做拆分,后面的*会被当成普通字符拼进匹配模式,根本通不过多通配符的测试
  • 拆模式的方式效率极低:每碰到一个*就生成2种匹配组合,k个*就拆出2^k个模式,数据量稍大就会出现指数级的计算膨胀,还叠了三层循环,冗余计算非常多

优化思路

按照规则定义,*的作用只是把紧邻的前一个字符变成“可出现0次或1次”的可选项,根本没必要拆出一堆组合模式。我们只要提前把每个字符的匹配要求(必须严格对上/可以跳过)整理成规则列表,再用双指针逐位比对就行,整个过程没有冗余的嵌套,复杂度也能压到线性级别的水平。
具体处理逻辑:

  • 先扫一遍子串生成匹配规则:普通字符先记成必须严格匹配的项,碰到*就把前一个普通字符的标记改成“可选”,*本身不占匹配位置(开头的*因为前面没字符,直接忽略;连续好几个*其实只需要改一次可选标记就行,没必要重复处理)
  • 然后从完整字符串的每个可能起始位置开始,按规则逐位比对:
    • 碰到必须匹配的项,当前位置字符对得上就同步往后走,对不上就直接换下个起始位置
    • 碰到可选的项,当前字符对得上就正常后移,对不上就直接跳过这个规则继续比后面的,不消耗原串的位置
  • 加个简单的剪枝:如果从当前起始位置到串尾的长度,还不够放下所有必须匹配的字符,就直接停掉遍历,省掉没用的计算

优化后的代码实现

def complex_search(fullstring, substring):
    # 预处理生成带可选标记的匹配规则
    match_rules = []
    prev_normal_char = None
    for c in substring:
        if c == "*":
            # * 仅修饰紧邻的前一个普通字符
            if prev_normal_char is not None:
                match_rules.pop()
                match_rules.append((prev_normal_char, True))
                prev_normal_char = None  # 避免连续*重复修改标记
        else:
            match_rules.append((c, False))
            prev_normal_char = c
    # 边界处理:规则为空时匹配任意内容
    if not match_rules:
        return True
    # 预计算匹配所需的最小长度(所有必选字符的数量)
    min_required_len = sum(1 for _, is_optional in match_rules if not is_optional)
    str_len = len(fullstring)
    rule_len = len(match_rules)
    # 逐起始位置做匹配
    for start in range(str_len):
        # 剪枝:剩余长度不够匹配必选字符,直接终止循环
        if str_len - start < min_required_len:
            break
        str_ptr = start
        rule_ptr = 0
        match_success = True
        while rule_ptr < rule_len:
            target, is_optional = match_rules[rule_ptr]
            # 指针走到原串末尾仍有规则未匹配,直接判定失败
            if str_ptr >= str_len:
                match_success = False
                break
            if fullstring[str_ptr] == target:
                str_ptr += 1
                rule_ptr += 1
            else:
                # 字符不匹配时,仅可选规则可以跳过
                if is_optional:
                    rule_ptr += 1
                else:
                    match_success = False
                    break
        if match_success:
            return True
    return False

# 测试用例
print(complex_search("dogandcats", "dogs*andcats"))  # 输出 True
print(complex_search("", "a*"))  # 输出 True,符合*匹配0次的规则
print(complex_search("a", "a*"))  # 输出 True,符合*匹配1次的规则
print(complex_search("test", "te*s*t"))  # 输出 True,支持多*场景

优化效果

  • 支持任意数量的*通配符,完全匹配规则定义
  • 时间复杂度从原来的指数级(O(2^k * n * m),k为的个数)降低到稳定的O(nm),不会出现计算量爆炸的问题
  • 消除了三层嵌套循环,逻辑直白易维护,符合Python的简洁编码习惯

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 21:15:09