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

正则校验密码时至少两个大写字母的规则失效问题求助

问题分析与修复

你的代码存在两个关键问题,其中长度校验的错误是导致AbC.123返回False的核心原因,大写字母校验的正则本身逻辑正确,但被前面的错误覆盖了结果:

错误点1:长度校验正则完全错误

你写的re.search(',{6,20}', password)是用来匹配连续6-20个逗号,而非检查密码的整体长度。这会导致任何不含连续6-20个逗号的密码都无法通过长度校验,直接将valid设为False。

错误点2:特殊字符正则的HTML转义问题

代码中的&lt;&gt;是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:03:26