2013-12-10 116 views
1

我正在設計一個系統,允許用戶輸入一個字符串,以及由非字母數字字符數量確定的字符串的強度。積分應如下授予:每個非阿爾納姆字符+1,最多3個非阿爾納姆字符。Python - 查找字符串中的所有非字母數字字符

def non_alnum_2(total,pwd): 
count = 0 
lid = 3 
number = 0 
if pwd[count].isalnum(): 
    if True: 
     print "Nope" 
    if False: 
     print "Good job" 
     count = count + 1 
     number += 1 
if number > lid: 
    number = lid 
return number 

total = 0 
number = 0 
pwd = raw_input("What is your password? ") 

non_alnum_2(total, pwd) 
print total 
total += number 

我剛剛開始編碼,所以我很抱歉,如果這看起來像一個非常初級的問題。

+0

你可能要考慮*正則表達式*。 – fuesika

+0

@pyStarter:'isalnum'的正則表達式讓事情變得更加複雜無理。 – abarnert

回答

6

你可以簡單地嘗試:

bonus = min(sum(not c.isalnum() for c in pwd), 3) 
+0

請注意,這依賴於布爾值可以被強制轉換爲數字(使用sum())的實現細節,而不是False因此是1.這個單線程使用min()對總和和最大獎勵進行編碼。 –

+0

這不是Python中True爲1的實現細節,它由語言保證。然而,對於新手來說,這非常神祕,特別是沒有解釋。 – abarnert

1

如果你想指望非字母串的數量,你可以說

def strength(string): 
    '''Computes and returns the strength of the string''' 

    count = 0 

    # check each character in the string 
    for char in string: 
    # increment by 1 if it's non-alphanumeric 
    if not char.isalpha(): 
     count += 1   

    # Take whichever is smaller 
    return min(3, count) 

print (strength("test123")) 
+0

*「最多3個非Alnum字符。」* – arshajii

+0

糟糕。我們走了。 – MxyL

0

沒有與此代碼的多個問題。

首先,if True:總是如此,所以"Nope"總是會發生,並且if False:永遠不會是真的,所以這些東西都不會發生。我想你想的:

if pwd[count].isalnum(): 
    print "Nope" 
else: 
    print "Good job" 
    count = count + 1 
    number += 1 

另外,我覺得要增加count總是,不只是如果它是一個符號,所以:

if pwd[count].isalnum(): 
    print "Nope" 
else: 
    print "Good job" 
    number += 1 
count = count + 1 

同時,你需要一些類型的循環如果你希望這個發生一遍又一遍。例如:

while count < len(pwd): 
    if pwd[count].isalnum(): 
     # etc. 

不過,你真的不需要自己維護count,繼續做pwd[count];您可以使用for循環此:

for ch in pwd: 
    if ch.isalnum(): 
     # etc. 

同時,當你做return從函數的最後一個值,你不與返回值做任何事情,當你調用功能。你需要的是:

number = non_alnum_2(total, pwd) 

而且,沒有理由來傳遞totalnon_alnum_2這裏。事實上,它根本沒有任何用處。

所以,把他們放在一起:

def non_alnum_2(pwd): 
    lid = 3 
    number = 0 
    for ch in pwd: 
     if ch.isalnum(): 
      print "Nope" 
     else: 
      print "Good job" 
      number += 1 
    if number > lid: 
     number = lid 
    return number 

pwd = raw_input("What is your password? ") 

number = non_alnum_2(pwd) 
print number 
相關問題