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

密码检查器处理特定输入触发re.error错误求助

问题排查:密码检查器正则错误"nothing to repeat"

错误原因

在scoring方法的循环逻辑里,你直接把密码的子串(比如测试用例里的^&*)作为正则模式传入re.search,但这些子串包含^、*等正则元字符——它们在正则语法里有特殊含义(比如*表示重复前置元素0次或多次)。当子串以*这类量词开头时,正则引擎找不到可重复的前置元素,就会抛出re.error: nothing to repeat错误。

另外还有一个隐性问题:self.password.lower()调用不会修改原字符串(Python字符串是不可变类型),所以后续检查键盘行时还是用的原密码的大小写,无法匹配小写的键盘行字符串。

修复方案

  1. 替换正则检查为字符串in操作:既然只是判断连续3个字符是否存在于键盘行字符串中,完全不需要用正则,直接用substring in row即可,彻底避免元字符解析问题。
  2. 修正小写转换逻辑:将密码转为小写后赋值给新变量,用于后续的键盘行检查。

修改后的scoring方法代码:

def scoring(self):
    length = len(self.password)
    if re.search(r"[a-z]", self.password): self.score += 5
    if re.search(r"[A-Z]", self.password): self.score += 5
    if re.search(r"[0-9]", self.password): self.score += 5
    if re.search(r"[!$%^&*()-_=+]",self.password): self.score += 5
    if re.fullmatch(r"[A-Za-z]+", self.password): self.score -= 5
    if re.fullmatch(r"[0-9]+", self.password): self.score -= 5
    if re.fullmatch(r"[!$%^&*()\-_=+]+", self.password): self.score -= 5
    # 修正小写转换,赋值给新变量
    lower_password = self.password.lower()
    for i in range(length - 2):
        substring = lower_password[i:i+3]
        # 用in操作符替代re.search,避免正则元字符问题
        if substring in row1 or substring in row2 or substring in row3:
            self.score -= 5
    print(self.score)

额外优化建议

  • 原validate方法里的[x for x in self.password if x not in allowed_char]可以改成any(x not in allowed_char for x in self.password),更高效(无需生成完整列表,找到一个无效字符就返回结果)。
  • 避免使用exit作为变量名,它是Python内置函数,可能引发命名冲突。

内容的提问来源于stack exchange,提问作者darkpidgeon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 15:05:19