使用 `re` 库进行输入验证

Input validation with the `re` library

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

目前我使用的是:

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

我希望确保输入在 15 之间。

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

有办法解决这个问题吗?我更喜欢仍然使用 re 库的解决方案,因为它适用于学校。

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 相同,除了它匹配整个字符串而不只是开头。

您可以使用单词边界

>>> 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'

re.match 只检查字符串的开头。你可以使用;

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

正在检查整个字符串。

您可以使用 ^(输入开始)和 $(输入结束)标记,将您的正则表达式转换为:

^[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