在python中使用不带重复字符的正则表达式进行密码验证
参数是一个字符串。检查它是否构成安全密码。 密码是安全的,如果在python中使用不带重复字符的正则表达式进行密码验证,python,regex,Python,Regex,参数是一个字符串。检查它是否构成安全密码。 密码是安全的,如果 其中至少有一个小写字母,并且 其中至少有一个大写字母,并且 其中至少有一个数字,并且 其中至少有一个特殊字符(+、-、*、/、.或@),并且 它至少包含8个字符,并且 它最多有20个字符,并且 其中没有三个相等的连续字符(例如“a7XXX@fda”因XXX而无效),并且 没有三个字符组出现多次(例如“XYZ.1a.XYZ”无效,因为XYZ出现两次) 我试过: regex = [r'^.{8,20}$', r'[a-z]+', r
- 其中至少有一个小写字母,并且
- 其中至少有一个大写字母,并且
- 其中至少有一个数字,并且
- 其中至少有一个特殊字符(+、-、*、/、.或@),并且
- 它至少包含8个字符,并且
- 它最多有20个字符,并且
- 其中没有三个相等的连续字符(例如“a7XXX@fda”因XXX而无效),并且
- 没有三个字符组出现多次(例如“XYZ.1a.XYZ”无效,因为XYZ出现两次)
regex = [r'^.{8,20}$', r'[a-z]+', r'[A-Z]+', r'\d+', r'[-+*/.@]', r'(.)(.)(.)(\1\2\3)']
return all(re.search(pas, password) for pas in regex)
您可以使用前瞻断言:
import re
reg=re.compile(r"(?=.*[a-z]+.*)(?=.*[A-Z]+.*)(?=.*\d+.*)(?=.*[-\+\*\./@]+.*)(?!.*(.)\1\1.*)(?!.*(.{3}).*\2.*).{8,20}$")
pwds=[ "aA3@5678", "aA3@567","abcdefghABCDEFGH+-*3","abcdefghABCDEFGH+-*3X","aA3@555678","aA3@@@5678", "a_A3Q_5678*A3Q", "a_A+Q_3.14/-5678*A+Q"]
for pwd in pwds:
m=reg.fullmatch(pwd)
print("{}: {}".format(pwd,"good" if m else "bad"))
100个字符的密码不安全?你做了什么来调试它?例如,您是否检查了每个正则表达式,以确定哪些正则表达式失败?另外,运行代码时会发生什么?是否所有密码都标记为安全?不安全的?你有错误吗?我觉得在你的情况下迭代输入会容易得多。请澄清最后一个条件。所有其他条件都是明确的:
返回重新搜索(r'^(?=[^a-z]*[a-z])(?=[^a-z]*[a-z])(?=\D*\D)(?=[^-+*/.@]*[-+*/.@])(?!.*()\1{2})。{8,20}$',s)
。很可能,您需要在{8,20}
之前添加一个额外的(?!*(…).*\2)
。看,我想这是家庭作业吧?如果你真的想确保“安全密码”,这会适得其反。如果它是家庭作业,它有助于准确地解释作业是什么。例如,您是否确实需要使用一系列正则表达式匹配项进行测试?如果没有,就像加拉布拉建议的那样,你可能至少不想对其中一些使用正则表达式,但如果需要,这样的建议会浪费你和我们的时间。非常感谢!!