密码检查器处理特定输入触发re.error错误求助
问题排查:密码检查器正则错误"nothing to repeat"
错误原因
在scoring方法的循环逻辑里,你直接把密码的子串(比如测试用例里的^&*)作为正则模式传入re.search,但这些子串包含^、*等正则元字符——它们在正则语法里有特殊含义(比如*表示重复前置元素0次或多次)。当子串以*这类量词开头时,正则引擎找不到可重复的前置元素,就会抛出re.error: nothing to repeat错误。
另外还有一个隐性问题:self.password.lower()调用不会修改原字符串(Python字符串是不可变类型),所以后续检查键盘行时还是用的原密码的大小写,无法匹配小写的键盘行字符串。
修复方案
- 替换正则检查为字符串
in操作:既然只是判断连续3个字符是否存在于键盘行字符串中,完全不需要用正则,直接用substring in row即可,彻底避免元字符解析问题。 - 修正小写转换逻辑:将密码转为小写后赋值给新变量,用于后续的键盘行检查。
修改后的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
相关产品推荐
相关产品推荐

