これは明らかに正規表現の仕事ですが、演習で正規表現を使用する必要があるかどうかはわかりません...
念のため、これを回答として投稿しています。それ以外の場合は、お知らせください...
#/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 を返すことができます (無効であることがわかったら、チェックを続けても意味がありませんよね?)