最近,我一直在为一个项目构建一个密码检查器,我一直在工作,但由于某种原因,某些输入导致错误发生,我不能弄清楚它是从哪里来的。如果有人能帮助这将是伟大的,因为我已经搜索了相当长的一段时间。
import re
exit = False
allowed_char = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!$%^&*()-_=+"
row1 = "qwertyuiop"
row2 = "asdfghjkl"
row3 = "zxcvbnm"
class password_checker:
def __init__(self, password, score):
self.password = password
self.score = score
def validate(self):
length = len(self.password)
if (length < 8 or length > 24) and [x for x in self.password if x not in allowed_char]:
print("Invalid Length and Invalid Character")
raise ValueError
elif length < 8 or length > 24:
print("Invalid length")
raise ValueError
elif [x for x in self.password if x not in allowed_char]:
print("Invalid Character")
raise ValueError
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
self.password.lower()
for i in range (length - 2):
if re.search(self.password[i:i+3], row1) or re.search(self.password[i:i+3], row2) or re.search(self.password[i:i+3], row3):
self.score -= 5
print(self.score)
while exit == False:
try:
choice = int(input("""1. Check Password
2. Generate Password
3. Quit: """))
print("")
if choice == 1:
password = input("Enter Password: ")
score = len(password)
checking = password_checker(password, score)
checking.validate()
checking.scoring()
elif choice == 2:
pass
elif choice == 3:
exit = True
else:
raise ValueError
except ValueError:
print("")
我已经尝试了多个输入,这些输入可以与我的代码一起使用,例如“sdAqwe 12!a^”
后来我尝试了“aSD 7V ^&* gS 77+”的测试用例
我期望这能正常工作,但由于某种原因发生了错误。
我认为这是因为类函数的评分。
这是我运行和收到的错误,谢谢
1. Check Password
2. Generate Password
3. Quit: 1
Enter Password: aSD7V^&*gS77+
Traceback (most recent call last):
File "main.py", line 53, in <module>
checking.scoring()
File "main.py", line 37, in scoring
if re.search(self.password[i:i+3], row1) or re.search(self.password[i:i+3], row2) or re.search(password[i:i+3], row3):
File "/nix/store/2vm88xw7513h9pyjyafw32cps51b0ia1-python3-3.8.12/lib/python3.8/re.py", line 201, in search
return _compile(pattern, flags).search(string)
File "/nix/store/2vm88xw7513h9pyjyafw32cps51b0ia1-python3-3.8.12/lib/python3.8/re.py", line 304, in _compile
p = sre_compile.compile(pattern, flags)
File "/nix/store/2vm88xw7513h9pyjyafw32cps51b0ia1-python3-3.8.12/lib/python3.8/sre_compile.py", line 764, in compile
p = sre_parse.parse(p, flags)
File "/nix/store/2vm88xw7513h9pyjyafw32cps51b0ia1-python3-3.8.12/lib/python3.8/sre_parse.py", line 948, in parse
p = _parse_sub(source, state, flags & SRE_FLAG_VERBOSE, 0)
File "/nix/store/2vm88xw7513h9pyjyafw32cps51b0ia1-python3-3.8.12/lib/python3.8/sre_parse.py", line 443, in _parse_sub
itemsappend(_parse(source, state, verbose, nested + 1,
File "/nix/store/2vm88xw7513h9pyjyafw32cps51b0ia1-python3-3.8.12/lib/python3.8/sre_parse.py", line 668, in _parse
raise source.error("nothing to repeat",
re.error: nothing to repeat at position 0
1条答案
按热度按时间w6lpcovy1#
您将使用
re.search
查看密码中的3个字符范围是否与键盘中的3个字符行匹配:但这就是问题所在。如果您的密码包含一个regex控制字符,
re
将尝试使用它。在您的示例"aSD7V^&*gS77+"
中,您将尝试序列"*gS"
。但这不是一个有效的regex。“*”告诉regex重复前面的字符零次或多次。但前面没有字符,因此re.error: nothing to repeat at position 0
请改用
in
。