要求用戶只能輸入數字(包括整數和小數),如何用正則表達式驗證用戶輸入?
有兩種思路:
1. 給出正確格式的正則表達式,然后看輸入是否合法。
2. 列出所有錯誤的輸入,看輸入是否非法。
對於思路1,想想其實有點不可靠,因為Python關於正則表達式的re模塊中,只有match()、search()、findall()方法可用,而它們都是在給出的字符串中查找匹配給定模式(Pattern)的子串,找到了就返回子串,沒有就返回None,並不是說整個字符串是否匹配該Pattern,按照思路1,若稍不注意,就達不到想要的效果,例如
1 def isNumReg(str): 2 regInt='\d+'#能匹配123、123.63、123eabd、abc236等所有包含了數字的字符串 3 regInt2='\d+$'#能匹配123、123.63、abc236等所有以數字結尾的字符串 4 regInt2='^\d+$'#只能匹配1、12、123等只包含數字的字符串 5 regFloat='\d+\.\d+'#能12.36、efa56.63、wwe56.56abc等字符串 6 regFloat2='^\d+\.\d+$'#能匹配2.36、0.36、00069.63、0.0、263.25等 7 8 #以下是整數和小數正確的正則表達式 9 regInt='^0$|^[1-9]\d*$'#不接受09這樣的為整數 10 regFloat='^0\.\d+$|^[1-9]\d*\.\d+$' 11 #接受0.00、0.360這樣的為小數,不接受00.36,思路:若整數位為零,小數位可為任意整數,但小數位數至少為1位,若整數位為自然數打頭,后面可添加任意多個整數,小數位至少1位 12 13 regIntOrFloat=regInt+'|'+regFloat#整數或小數 14 15 patternIntOrFloat=re.compile(regIntOrFloat)#創建pattern對象,以便后續可以復用 16 if patternIntOrFloat.search(str): 17 return True 18 if re.search(patternIntOrFloat,str): 19 return True 20 if re.search(regIntOrFloat,str): 21 return True 22 else: 23 return False 24 25 if __name__=='__main__': 26 print isNumReg("0.360")#True
第2-6行說明開始符號(^)和結束($)的作用,
第9行、第13行說明了正則表達式中“或者”的表示方法為一條豎線('|')
第16行、第18行、第20行三者相互等價,即可以用pattern對象的search方法,也可以將pattern對象作為re.search()的參數,也可以將模式字符串作為re.search()的參數。
