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

如何用原生Python实现单词与指定规则模式的匹配校验

原代码存在的问题
  • 没有校验单词和模式的长度一致性,长度不同的场景会出现索引越界或者匹配错误
  • 逻辑中存在无意义的相邻模式字符判断if pattern_list[j] != pattern_list[j-1],会导致模式中存在连续相同明文字符的场景匹配错误
  • 仅校验了明文字符出现在其他索引的情况,没有校验非下划线位置单词字符是否和模式一致,比如模式为a__、单词为b__的场景会错误返回True
实现思路
  • 第一步:长度校验,单词与模式长度不同直接返回False,这是匹配的前提
  • 第二步:收集模式中所有明文字符对应的索引位置,存入字典方便后续校验
  • 第三步:校验第一个匹配条件:所有模式非下划线的位置,单词对应位置必须和明文字符完全一致
  • 第四步:校验第二个匹配条件:模式中出现过的明文字符,不能出现在单词的非指定索引位置

注意:如果你传入的模式是类似d _ _ _ _ a _ _ _ _带空格的格式,可在函数开头新增一行代码pattern = pattern.replace(' ', '')预处理去除空格后再做后续校验。

正确实现代码
def check_exact_locations(word, pattern):
    # 长度不匹配直接返回False
    if len(word) != len(pattern):
        return False
    # 收集模式里所有明文字符对应的索引
    pattern_char_pos = {}
    for idx, char in enumerate(pattern):
        if char != '_':
            if char not in pattern_char_pos:
                pattern_char_pos[char] = []
            pattern_char_pos[char].append(idx)
    # 校验条件1:非下划线位置字符必须完全匹配
    for char, positions in pattern_char_pos.items():
        for pos in positions:
            if word[pos] != char:
                return False
    # 校验条件2:明文字符不能出现在非指定位置
    for idx, char in enumerate(word):
        if char in pattern_char_pos and idx not in pattern_char_pos[char]:
            return False
    return True
测试验证

你给出的示例测试用例可直接验证:
模式为d____a____(总长度10),输入delegating、dishwasher、derogation均返回True
其他测试场景:

  • 模式a__l_、单词apple → 返回True
  • 模式_pp_e、单词apple → 返回True
  • 模式a____、单词ababa → 返回False(单词第2、4位出现了模式仅允许在第0位出现的a)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:36:03