2012-08-06 134 views
1

我正在做一些在線教程......並且我被困在練習中:定義一個函數postalValidate(S),它首先檢查S是否代表有效的郵政編碼。 注意:我應該用字符串,列表,if語句,循環和其他基本結構(如變量和函數)來解決它。驗證郵政編碼?

首先,刪除所有空格; 其餘的形式必須是​​,其中L是字母(在任一小寫或大寫)和#是數字。

如果S不是一個有效的郵政編碼,返回布爾False。如果S有效,請返回格式爲​​的相同郵政編碼的版本,其中每個L都是大寫。

我已經創建了這些運動代碼,但年級學生說,這是錯誤的,但我將發佈它。

def postalValidate(S): 
    while " " in S: 
    S.remove(" ") 
    for i in range(1,6,2): 
    S.isdigit(S[i]) 
    for j in range(0,5,2): 
    S.upper(S[j] 
    S.isalpha(S[j]) 
    return True 
+2

你可以使用[replace()](http://docs.python.org/library/stdtypes.html?highlight=replace#str.replace) 'while循環呢。 *還有*,在某些情況下,你是否還想返回False? – Levon 2012-08-06 16:41:02

+0

我要求返回真,如果真的是假,比它會返回假...我想... – Reginald 2012-08-06 16:46:40

+1

'真'將永遠是真實的。 – 2012-08-06 16:53:53

回答

3

,這顯然是對正則表達式的工作,雖然我不知道你是否應該在鍛鍊使用它們...

我張貼此作爲一個答案就在你可以。否則,讓我們知道...

#/usr/bin/evn python 

import re 
zipCode = re.compile(r"\s*(\w\d\s*){3}\s*") 

if __name__ == "__main__": 
    samples = [ 
     "   44F 4 F", #Invalid 
     " L0L0L0 ", #Valid 
     " L0 L0 L0 ", #Valid 
    ] 

    for sample in samples: 
     if zipCode.match(sample): 
      print "The string %s is a valid zipCode (nice and clean: %s)" % (sample, sample.replace(" ", "").upper()) 
     else: 
      print "The string %s is NOT a valid zipCode" % sample 

編輯:

既然你不能使用正則表達式,我建議你換一種思維方式...而不是檢查的如果文字屬於有效的郵政編碼,我建議你做相反:檢查,如果他們沒有在一個有效的郵政編碼屬於,儘快返回FALSE爲你檢測放錯位置(或錯誤的)性格:

def postalValidate(S): 
    S = S.upper().replace(" ", "") 
    if len(S) == 6: 
     for i in range(len(S)): 
      if i % 2 == 0: 
       #Even index (0, 2, 4, 6...) , has to be 'letter' 
       if not(S[i].isalpha()): 
        return False 
      else: 
       #Odd index (1, 3, 5, 7...), must be 'number' 
       if not(S[i].isdigit()): 
        return False 

    else: 
     #You can save some cpu ticks here... at this point, the string has to be of length 6 or you know it's not a zip 
     return False 
    return S 

return語句所以一旦你意識到有一些「錯誤」與要檢查的字符串停止當前函數的執行,你可以返回False(有上保持檢查是沒有意義的,一旦你知道它是不是有效的,對不對? )

+0

我不能使用這些...我應該用字符串,列表,如果語句和循環,以及其他基本知識如變量和函數來解決它... – Reginald 2012-08-06 17:02:20

+2

@Reginald你應該更新你的文章提及這個限制 - 不是每個人都會閱讀每一條評論:) – Levon 2012-08-06 17:04:12

+0

'\ w'匹配數字以及字母,並且您可能希望確保匹配後沒有任何尾隨垃圾,所以我建議'\ s * ([a-zA-Z] \ s * \ d \ s *){3} $' – 2012-09-14 17:33:15

1

所以想必S是一個字符串,所以我會去關的那個。首先,你打電話給isdigit和isalpha是錯誤的,其次,如果它不是有效的郵政編碼,你永遠不會返回false。無論您的代碼中發生了什麼,return True總是返回True。這是我認爲你正在試圖做的:

def postal_validate(s): 
    s = s.replace(' ', '') 
    for i in range(1,6,2): 
     if (not s[i].isdigit()): 
      return False 
    for i in range(0,5,2): 
     if (not s[i].isalpha()): 
      return False 
    return s.upper() 

我可能是錯的,當然。

+0

Therw也有關於返回重新格式化郵資編碼的要求(當然,這是OP的責任,而不是你的) – 2012-08-06 17:03:57

+0

這就是就像在最後返回s.upper()而不是True一樣簡單。我很難確定OP需要什麼。 – DrGodCarl 2012-08-06 17:06:13

0
import re 

regex ="[a-zA-Z]+\d+[a-zA-Z]+\d+[a-zA-Z]+\d+" 

def ispostal(v): 
    v = re.sub('\s+', '', v) 
    if re.match(regex, v): 
     return v.upper() 
    else: 
     return False 
+3

我認爲這可能有助於OP提供一些解釋(特別是關於重新) – Levon 2012-08-06 17:01:52

1
import re 
def postalValid(S): 
    spaceless = S.replace(' ','') 
    if not re.match(r"[a-zA-Z][0-9]+[a-zA-Z][0-9]+[a-zA-Z][0-9]+",spaceless): 
     return False 
    return spaceless.upper() 

正則表達式(蟒蛇re module)尋找在字符串中的模式。

[a-zA-Z]將完全匹配1個字母

[0-9]+將匹配一個或多個數字(即0,9,99,9999)...如果你只是想一個數字剛剛擺脫加上運營商的[0-9]+,使之[0-9]將匹配恰好有一個數字

所以 [a-zA-Z][0-9]+[a-zA-Z][0-9]+[a-zA-Z][0-9]+匹配一個字母后面的數字(多位數字是罰款),後跟一個字母后跟用另一個號碼後面的另一封信,並與多家結束

如果您不能使用正則表達式,那麼你可以做

def postalValid(S): 
    no_spaces = S.replace(" ","") 
    if len(no_spaces) > 6: return false 
    for i in range(6): 
     if i%2: 
      if not no_spaces[i].isdigit():return False 
     else: 
      if not no_spaces[i].isalpha():return False 

    return no_spaces.upper() #True 

但假定每個號碼只有一個數字

+0

我認爲這可能有助於OP提供一些解釋(特別是關於重新) – Levon 2012-08-06 17:01:36

+1

我試過......至少有點點 – 2012-08-06 17:05:45

1

我沒有發佈確切的代碼,但只是算法。 請閱讀在線評論。(注:下面是不是Python代碼..)

def postalValidate(S): 
    while " " in S: 
    S.remove(" ") #Are you sure this will work? Strings are immutable.. You need to assign back to `S` 

    for i in range(1,6,2): 
    if s[i] is not a digit: 
     return False 
    for j in range(0,5,2): 
    S.upper(S[j]) # you need to assign to S[j] again, plus use ".upper()" 
    if S[j] is not alpha: 
     return False 
    return s.upper() #simple .upper() will do the job. 

如果你可以用re,將它作爲簡單:

if re.search(r'^([a-zA-Z][0-9]){3}$', s.strip()): 
    return s.strip().upper() 
return False 
1

這裏的編寫和驗證一個相對簡單的方法鍛鍊功能。第一個空格字符將從字符串參數中刪除,這會在進程中創建它的本地副本。然後根據是否有些長邏輯表達式中的每個子表達式評估爲True來返回一個布爾值。

def postalValidate(s): 
    s = s.replace(" ", "") 
    return(len(s) == 6 and 
      all(s[i].isdigit() for i in range(1, 6, 2)) and 
      all(s[i].isalpha() for i in range(0, 5, 2))) 

if __name__ == '__main__': 
    for testcase in 'a1b2c3', '980222', 'A456C7': 
     print('postalValidate({!r}) -> {}'.format(testcase, 
                postalValidate(testcase))) 

輸出:

postalValidate('a1b2c3') -> True 
postalValidate('980222') -> False 
postalValidate('A456C7') -> False 
2

我碰巧工作在相同的教程,用相同的編碼約束。幾個小時撓頭的後:

def postalValidate(S): 
    S = S.replace(" ","") 
    if len(S) != 6 or S.isalpha() or S.isdigit(): 
     return False 
    if not S[0:5:2].isalpha(): 
     return False 
    if not S[1:6:2].isdigit(): 
     return False 
    return S.upper() 
0

我知道一切都太遲了,但讓我嘗試回答這個問題,因爲我剛剛完成了在同一鍛鍊工作。

按照exercise,定義一個函數postalValidate(S)其首先檢查是否S表示郵政編碼(加拿大),其是有效的:

  • 第一,刪除所有的空格;

  • 其餘的形式必須是​​,其中L是字母(在
    低於或大寫字母)和#號。

如果S不是一個有效的郵政編碼,返回布爾False。如果S有效,請返回格式爲​​的相同郵政編碼的版本,其中每個L都是大寫。

,他們剛剛覆蓋下面的方法都應該被使用:

str.replace()str.isalpha()str.isdigit()str.upper()

他們的站點不允許導入模塊,不能使用 這樣的正則表達式。

這裏是我的代碼:

def postalValidate(S): 
    S = S.replace(' ', '') 
    if len(S) == 6: 
     if S[::2].isalpha() and S[1::2].isdigit(): # slicing with step 
     return S.upper() 
     else: 
     return False 
    else: 
     return False 

試運行包括這些論點: 'H0H0H0', '郵政', 'D3 L3 T3', '3D3 L3 T', '', 'N21 3g1z',' V4L1D','K1A 0A3','H0H0H'