2017-07-19 50 views
2

我有以下代码为强度测试密码:密码测试在Python

import string 
def golf(password): 
    if len(password) >= 10: 
     if any(char.isdigit() for char in password): 
      if any(string.punctuation for char in password): 
       if any(char.isalpha() for char in password): 
        if any(char.isupper() for char in password): 
         if any(char.islower() for char in password): 
          return True 
    return False 

我知道这是可以做的更好!它需要测试以下...

密码将被认为是足够强大,如果它 有至少10个字符 至少包含一个数字 包含至少一个大写字母 包含至少一个小写字母。密码可能只包含ASCII拉丁字母或数字,但标点符号。

编辑

确定为别人我得到它下降到与正则表达式如下。

import re 
def golf(password): 
    return re.match(r'^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.{10,30}).+$', password) 

显然,它仍然是短...

+2

你不能使用'和'? –

+2

'如果有(字符串中的字符串的密码):'看起来不对 –

+1

你有没有考虑过正则表达式匹配? –

回答

3

其实,你是相当接近。是的,你有各种条件要检查;规则那并发症。请注意,您不必检查alpha:检查islowerisupper覆盖。您可以通过将规则到一个单一的表达使这只是一个小更容易处理:

import string 
def golf(password): 
    return \ 
     len(password) >= 10        and \ 
     any(char.isdigit() for char in password)   and \ 
     not any(string.punctuation for char in password) and \ 
     any(char.isupper() for char in password)   and \ 
     any(char.islower() for char in password) 

注意,你正在评估布尔表达式:刚刚返回值。有没有必要说

if <expr>: 
    return True 
else: 
    return False 

您已经在手的价值;只是返回它。

+1

我觉得应该是'所有(CHAR不string.punctuation' –

+0

我刚好赶上,虽然编辑的文本。 – Prune

+0

这个答案是有益的,谢谢!我仍然认为这是可以做到更短虽然..也许正则表达式? –

0

这是if语句XD的一个长字符串。你应该只使用一些和声明。

if len(password) >= 10 and any(char.isdigit() for char in password)...: 
    return True 
else: 
    return False 

如你所知,else语句不是必需的,但它使代码更具可读性。

+0

谢谢你,是的,如果你使用和陈述,但更难以阅读也缩短了,我相信它可以阅读和缩短。 –

+0

没问题,很高兴我能帮助 – Matthew

0

更优的方法是做你的性格检查所有在一个循环。

import string 
def golf(password): 
    if len(password) < 10: 
     return False 

    saw_digit = saw_upper = saw_lower = False 
    no_punct = all_alnum = True 

    for char in password: 
     saw_digit = saw_digit or char.isdigit() 
     saw_upper = saw_upper or char.isupper() 
     saw_lower = saw_lower or char.islower() 
     no_punct = no_punct and (char not in string.punctuation) 
     all_alnum = all_alnum and char.isalnum() 

    values = [saw_digit, saw_lower, saw_upper, no_punct, all_alnum] 
    # print(values) 
    return all(values)