2017-07-19 52 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)