如何用原生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
相关产品推荐
相关产品推荐

