使用`re`库输入验证

时间:2015-01-23 18:17:23

标签: python regex validation input

我正在使用re库学习Python输入验证。

目前我正在使用以下内容:

valid = re.match('[1-5]', UserInput)

我希望确保输入介于15之间。

这种方法只有一个问题;如果我输入的内容以1-5开头,后跟其他内容(例如,1bdfgh,354),则认为它有效。

有解决方法吗?我更希望解决方案仍然使用re库,因为它适用于学校。

4 个答案:

答案 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)

检查整个字符串。