如何实现密码强度校验中的键盘连续字符阶梯扣分逻辑?
完善密码强度校验器的键盘连续序列扣分逻辑
我来帮你搞定这个键盘连续组合的扣分逻辑!根据你的需求,我们需要不区分大小写检测密码中匹配键盘连续序列的片段,并且按照连续长度递增扣分(越长扣越多),还要避免重复扣分同一段内容。
核心思路拆解
- 统一大小写:先把输入密码转为小写,解决大小写不敏感的问题。
- 生成键盘连续子串库:从给定的键盘顺序列表中,生成所有长度≥2的连续子串,并且按长度从长到短排序——这样可以优先匹配长片段,避免短片段重复扣分(比如"qwerty"不会被拆成"qwe"+"wer"+...多次扣分)。
- 匹配与扣分:遍历密码的所有可能子串,匹配键盘连续子串,根据长度扣除对应分数,同时标记已匹配的位置防止重复计算。
完整代码实现
def deduct_keyboard_pattern_score(password, score): keyboard_pattern = ['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'z', 'x', 'c', 'v', 'b', 'n', 'm'] # 把键盘列表转为字符串,方便生成连续子串 keyboard_str = ''.join(keyboard_pattern) password_lower = password.lower() used_indices = set() # 记录已扣分的字符位置,避免重复计算 # 生成所有长度≥2的键盘连续子串,按长度从长到短排序 keyboard_substrings = [] max_length = len(keyboard_str) for length in range(max_length, 1, -1): for start in range(max_length - length + 1): substr = keyboard_str[start:start+length] keyboard_substrings.append((substr, length)) # 自定义扣分权重:连续长度越长,扣分递增(可根据需求调整) def calculate_deduction(length): # 示例规则:长度2扣5,3扣15,4扣30,5扣50... 公式为 length*(length+3)*0.5 return int(length * (length + 3) / 2) * 2 # 调整系数让扣分更明显 # 遍历匹配所有键盘连续子串 for substr, length in keyboard_substrings: start_idx = 0 while start_idx <= len(password_lower) - length: current_sub = password_lower[start_idx:start_idx+length] if current_sub == substr: # 检查这段位置是否已经被扣分过 if not any(i in used_indices for i in range(start_idx, start_idx+length)): deduction = calculate_deduction(length) score -= deduction print(f"检测到键盘连续序列'{substr}',扣除{deduction}分") # 标记这段位置为已使用 used_indices.update(range(start_idx, start_idx+length)) # 跳过已匹配的片段,继续查找下一个 start_idx += length else: start_idx += 1 return score # 测试示例 test_password = "djoDFGibTY" initial_score = 100 final_score = deduct_keyboard_pattern_score(test_password, initial_score) print(f"初始分数:{initial_score},最终分数:{final_score}")
代码说明
- 大小写处理:通过
password.lower()统一转为小写,确保"DFG"和"dfg"都能匹配。 - 避免重复扣分:用
used_indices集合记录已经扣过分的字符索引,比如匹配了"dfg"后,里面的"df"和"fg"不会再被单独扣分。 - 自定义扣分规则:
calculate_deduction函数可以根据你的需求调整,比如你想要连续2个扣5分、3个扣15分、4个扣30分,直接修改公式即可。 - 测试示例:输入密码
djoDFGibTY会匹配到"dfg"(长度3,扣18分)和"ty"(长度2,扣10分),初始100分最终会得到72分。
可选优化
如果你不需要严格避免重复扣分(比如希望即使长片段包含短片段,也分别扣分),只需要删除used_indices相关的代码即可,但这种情况会导致分数扣得过于严厉,一般不推荐。
内容的提问来源于stack exchange,提问作者AntimoniumHeptadiene
相关产品推荐
相关产品推荐

