我正在使用re
库学习Python输入验证。
目前我正在使用以下内容:
valid = re.match('[1-5]', UserInput)
我希望确保输入介于1
和5
之间。
这种方法只有一个问题;如果我输入的内容以1-5
开头,后跟其他内容(例如,1bdfgh,354),则认为它有效。
有解决方法吗?我更希望解决方案仍然使用re
库,因为它适用于学校。
答案 0 :(得分:2)
您可以使用字边界
>>> a = '1sdv'
>>> valid = re.match('[1-5]',a)
>>> valid.group() # Wrong Match
'1'
>>> valid = re.search(r'^\b[1-5]\b$',a) # Correct Way
>>> valid.group()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
>>> a = '1'
>>> valid = re.search(r'^\b[1-5]\b$',a)
>>> valid.group()
'1'
>>> a = '1 potato'
>>> valid = re.search(r'^\b[1-5]\b$',a)
>>> valid.group()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
答案 1 :(得分:1)
re.match
只会检查字符串是否以您提供的模式启动。要使它与整个字符串匹配,您可以执行以下操作:
valid = re.match('[1-5]$', UserInput)
在正则表达式模式中,$
表示字符串的结尾。因此,上面的模式将匹配以集合[1-5]
中的字符开头然后结束的字符串。满足此条件的唯一字符串是'1'
,'2'
,'3'
,'4'
和'5'
。
请注意,在Python 3.4中,您可以使用re.fullmatch
:
valid = re.fullmatch('[1-5]', UserInput)
它与re.match
相同,只是它匹配整个字符串而不仅仅是开头。
答案 2 :(得分:1)
您可以使用^
(输入开头)和$
(输入结束)令牌,将您的正则表达式转换为:
^[1-5]$
但是对于数值范围检查,有一个更简单的解决方案:
theNumber = int(UseInput)
valid = 1 <= theNumber <= 5
甚至:
theNumber = int(UserInput)
valid = theNumber in range(1,6) #up to six, exclusive, so from 1 to 5 inclusive
答案 3 :(得分:0)
re.match
仅检查字符串的开头。你可以使用;
valid = re.search('[1-5]',UserInput)
检查整个字符串。