2015-01-23 6 views
0

Я изучаю Python входную проверку с помощью библиотеки re.Проверка ввода в библиотеке `re`

В настоящее время я использую следующие:

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

Я хочу, чтобы убедиться, что вход между 1 и 5.

Существует только одна проблема с этим методом; если я вводю что-то, начинающееся с 1-5, за которым следует что-то еще (например, 1bdfgh, 354), считается действительным.

Есть ли способ обойти это? Я бы предпочел, чтобы решение все еще использовало библиотеку re, как и для школы.

+0

Вы хотите, что вход только между 1-5 ? Нет строк и т. Д.? – GLHF

+0

Вы можете использовать '[1-5] {1}' – ForceBru

+0

Почему бы просто не проверить, есть ли 'int (UserInput) в [1, 2, 3, 4, 5]'? –

ответ

1

re.match будет проверять, только строка начинает с рисунком, который вы ему дадите. Для того, чтобы он соответствовал всей строке, вы можете сделать:

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

В Regex модели, $ представляет собой конец строки. Таким образом, вышеприведенный шаблон будет соответствовать строкам, которые начинаются с символа в наборе [1-5], а затем заканчиваются. Единственными строками, которые удовлетворяют этому условию, являются '1', '2', '3', '4' и '5'.


Обратите внимание, что в Python 3.4, вы можете использовать re.fullmatch для этого:

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

Это то же самое, как re.match, за исключением того, что она соответствует всей строки, а не только самого начала.

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

Это все равно будет соответствовать входу, например '1 potato' – Kroltan

+0

@Kroltan Что делать, если я делаю' valid = re.search (r '^ [1-5] $', a) ' –

+0

Все те же вещи ... – Kroltan

0

re.match проверяет только начало строки. Вы можете использовать;

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

который проверяет всю строку.

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 
+0

'^' не нужно, так как 're.match' закреплен в начале. – iCodez

+0

@iCodez True. Но я все равно сохранил бы это для ясности. (по крайней мере для меня, я всегда путаю, какие из «совпадений» и «поиска» привязаны) – Kroltan