我想验证用户的密码是否为:
我的代码是:
r.match(r'([A-Z]+)([a-z])([0-9]+)($|?|!){8}',password)
这是正确答案吗?我不知道如何指定,该顺序在正则表达式中无关紧要。
EDITED 使用一些建议我编辑了我的代码:
m = re.compile(r'^(?=.*\d)(?=.*[A-Z])(?=.*[\$|\?\!])[A-Za-z\d$!&]{8}$')
m.match('adwA12f!')
<_sre.SRE_Match object; span=(0, 8), match='adwA12f!'>
如果有可能澄清,你能取悦,究竟是什么“?=。”正则表达式意味着。
答案 0 :(得分:2)
这似乎在IDLE 2.7.9中进行了测试。请记住,这只匹配8个字符
^(?=.*[!$?])(?=.*[a-z])(?=.*[A-Z]).{8}$
import re
p = re.compile('^(?=.*[!$?])(?=.*[a-z])(?=.*[A-Z]).{8}$')
test_str = 'a2Cd$F!8'
if re.search(p, test_str):
print('string matched')
输出:
string matched
?=
是一个先行断言;建议您阅读本网站:"Lookahead Assertion"
.
匹配除换行符之外的任何字符;由于您有方括号,.
仅限于[]
中定义的内容;也称为原子分组。
答案 1 :(得分:0)
我想明显的非正则表达方式是:
symbols = '$!?'
if (len(pwd) >= 8 and
any(c.isdigit() for c in pwd) and
any(c.isupper() for c in pwd) and
any(c in symbols for c in pwd) and
all(c.isalnum() or c in symbols for c in pwd)):
print('good password')
else:
print('bad password')
你没有说,但我认为你也至少要一个小写。如果是这样,也添加这个子句
any(c.islower() for c in pwd)
答案 2 :(得分:0)
至少在我的系统上,不使用re
进行检查的速度要快一些。此外,随着密码长度的增加,速度差异似乎变得更加明显。
import re
import timeit
passwords_varied = ("kk", "999999999999999999999999", "kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk", "gkrDsh!2", "gjtlssssssssssssssssfsdg43ggw3fa2adada2fagaa2adajjjjjjjjjjjjjjjkhjkhjkhjkd45!", "kit43MM?", "fkthrej!", "483kkED!")
passwords_8chars = ("hktj33cD", "!?gk329s", "fkrK44?a", "dlekAS2$", "??ffD913")
def check1(s):
return len(s) == 8 and \
any(x.isdigit() for x in s) and \
any(x in ("$","!","?") for x in s) and \
any(x.isupper() for x in s)
def check2(s):
if len(s) == 8 and \
re.search(r"\d", s) and \
re.search(r"[$!?]", s) and \
re.search(r"[A-Z]", s):
return True
return False
def run1(passwords):
for password in passwords:
check1(password)
def run2(passwords):
for password in passwords:
check2(password)
def main():
print ("---- list comprehension approach ----")
print ("varying length passwords")
print(timeit.timeit("run1(passwords_varied)", setup="from __main__ import run1, passwords_varied", number=100000))
print ("correct length passwords")
print(timeit.timeit("run1(passwords_8chars)", setup="from __main__ import run1, passwords_8chars", number=100000))
print ""
print "---- 're' approach ----"
print ("varying length passwords")
print(timeit.timeit("run2(passwords_varied)", setup="from __main__ import run2, passwords_varied", number=100000))
print "correct length passwords"
print(timeit.timeit("run2(passwords_8chars)", setup="from __main__ import run2, passwords_8chars", number=100000))
if __name__ == '__main__':
main()
"""
---- list comprehension approach ----
varying length passwords
2.69666814804
correct length passwords
3.31486010551
---- 're' approach ----
varying length passwords
3.27806806564
correct length passwords
4.286420106
"""