要求用户只能输入数字(包括整数和小数),如何用正则表达式验证用户输入?
以下为简单但不严谨的正则表达式:
pat1='\d+(?:\.\d+)?'#整数或小数
#金额数值(小数或整数,整数部分每三位数加一个逗号),例如24,581,644.07元、1,000,000元、100.0元、2.09万元、5亿元等,但不匹配1001元这类不符合逗号划分规则的金额
pat2='(?:\d{1,3},)?(?:\d{3},)*(?:\d{3})(?:\.\d+)?[亿万]*元|\d{1,2}(?:\.\d+)?[亿万]*元' #'^(?:\d{1,3},)*\d{3}(?:\.\d+)?[亿万]*元|^\d{1,2}(?:\.\d+)?[亿万]*元'
其中pat1中的
(?:\.\d+)
\.\d+表示小数点及后面多个整数,(?:exp)表示匹配exp但不获取,(?:exp)?最后的问号表示最多一个exp.
pat2的思路是把数值分为2类:三位数及以上的数值、最多两位数的数值。
其他
有两种思路:
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()的参数。