正则校验密码时至少两个大写字母的规则失效问题求助
问题分析与修复
你的代码存在两个关键问题,其中长度校验的错误是导致AbC.123返回False的核心原因,大写字母校验的正则本身逻辑正确,但被前面的错误覆盖了结果:
错误点1:长度校验正则完全错误
你写的re.search(',{6,20}', password)是用来匹配连续6-20个逗号,而非检查密码的整体长度。这会导致任何不含连续6-20个逗号的密码都无法通过长度校验,直接将valid设为False。
错误点2:特殊字符正则的HTML转义问题
代码中的<>是HTML转义字符,实际在Python正则里应写成<>,否则无法匹配尖括号这类特殊字符。
修复后的代码
import re password = input("Input password: ") def valid_pw(password): valid = True # 校验长度:直接用len判断更直观高效 if not (6 <= len(password) <= 20): valid = False # 校验至少一个数字 if not re.search(r'[0-9]', password): valid = False # 校验至少两个大写字母:两种方式可选 # 方式1:正则匹配两个大写字母(中间可包含任意字符) if not re.search(r'[A-Z].*[A-Z]', password): valid = False # 方式2:统计大写字母数量,逻辑更直观 # if len(re.findall(r'[A-Z]', password)) < 2: # valid = False # 校验至少一个特殊字符(修正HTML转义问题) if not re.search(r'[$&+,:;=?@#|<>.*^()%!-]', password): valid = False return valid print(password, "is valid: ", valid_pw(password))
验证测试
输入AbC.123时:
- 长度为7,符合6-20的要求
- 包含数字
123 - 包含两个大写字母
A和C - 包含特殊字符
.
因此会返回True,符合预期。
额外优化建议
可以用正向预查把所有规则整合到一个正则中,减少多次re.search调用,代码更简洁:
def valid_pw(password): pattern = r'^(?=.*[0-9])(?=.*[A-Z].*[A-Z])(?=.*[$&+,:;=?@#|<>.*^()%!-]).{6,20}$' return bool(re.fullmatch(pattern, password))
这个正则通过^和$锚定整个字符串,用(?=...)确保所有校验条件同时满足。
内容的提问来源于stack exchange,提问作者newbeat
相关产品推荐
相关产品推荐

