Python密码校验如何实现连续3次相同字符出现则返回False?
密码校验代码问题诊断与修复方案
现有代码的核心问题
你编写的校验逻辑存在两个本质错误,完全无法匹配需求:
password.count(char) > 3统计的是字符在整个密码中的总出现次数,不是连续出现次数,比如密码A1A!A2里A总共出现3次但不连续,会被你误判为不合法;反过来密码AAA1b!里A连续出现3次,但总次数等于3不会触发你的判断条件,会被误判为合法- 阈值设置错误:需求是连续出现3次就返回False,你的判断条件是
>3,需要总出现4次才会触发,逻辑本身就和要求相悖
修复后完整代码
def passwordlength(password: str): upper = digit = special = False for char in password: # 这里用内置方法替代手写字符串,更简洁不易出错 if char.isupper(): upper = True elif char.isdigit(): digit = True elif char in "$#@%!": special = True return upper and digit and special def passwordOK(password: str): # 先校验原有基础规则 if not passwordlength(password): return False if not (6 < len(password) < 12): return False # 新增连续相同字符校验逻辑 consecutive_count = 1 for i in range(1, len(password)): if password[i] == password[i-1]: consecutive_count += 1 # 连续相同字符达到3次直接返回不合法 if consecutive_count >= 3: return False else: # 字符不同就重置连续计数 consecutive_count = 1 return True
验证效果
- 输入
AAA123!a:存在连续3个A,返回False,符合预期 - 输入
A1A2A3!b:A总出现3次但不连续,返回True,符合预期 - 输入
Ab123!!c:所有字符连续次数都不超过2,返回True,符合预期
内容的提问来源于stack exchange,提问作者Joshua Bradley
相关产品推荐
相关产品推荐

