使用 `re` 库进行输入验证
Input validation with the `re` library
我正在学习 Python 使用 re
库进行输入验证。
目前我使用的是:
valid = re.match('[1-5]', UserInput)
我希望确保输入在 1
和 5
之间。
这个方法只有一个问题;如果我输入的内容以 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
我正在学习 Python 使用 re
库进行输入验证。
目前我使用的是:
valid = re.match('[1-5]', UserInput)
我希望确保输入在 1
和 5
之间。
这个方法只有一个问题;如果我输入的内容以 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