至少在我的系统上,做检查,而无需使用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
"""
来源
2016-06-13 17:49:12
jDo
您是否对任何字符串进行过测试?请添加到问题。正则表达式与您所描述的不匹配。 –
一个简单的方式来说,顺序并不重要,是单独测试模式 –
我不认为试图解决它在一个正则表达式是一个好主意。为了提高可读性和可测试性,请使用多重检查来解决问题,例如像完成[这里](http://stackoverflow.com/a/32542964/771848)。 – alecxe