2015-05-16 4 views
-1

Кажется, я не могу найти, как ограничить пользователя использованием реальных чисел и буквы Q в качестве переменной. (начало обучения Python этим утром)Как я могу убедиться, что пользователь вводит строку, содержащую только числа, операторы и букву Q?

astr = 0 
while True: 
     astringfunctionMB = raw_input('please enter MB equation in terms of Q e.i 95-.5*Q : ') 
     if (float(astringfunctionMB) or "Q" in astringfunctionMB): 
       print "Please try again" 
       #else if 
     else: 
      break 
      astr = astringfunctionMB 
+0

вы, вероятно, следует использовать регулярные выражения. – CoDhEr

+0

Ваше название говорит «цифры, операторы», ваш текст говорит «только реальные числа». Что он? – cdarke

+1

Вам нужно только проверить, что строка содержит числа, операторы и Q, а также (как я полагаю), что это допустимое выражение? (например, «1Q ******» содержит только числа Q и операторы, но это не является допустимым выражением) – Zac

ответ

6

Существует несколько способов сделать это; Я бы либо использовать regular expression:

import re 

... 

if re.match(r'^[\dQ+\-*/.]$', astringfunctionMB): 
    ... 

(см demo для тестирования) или создать set допустимых символов для проверки против:

import string 

VALID_CHARS = set(string.digits + 'Q+-*/.') 

... 

if astringfunctionMB and all(char in VALID_CHARS for char in astringfunctionMB): 
    ... 

Заметим, однако, что это не обязательно означает, что вход пользователя является допустимым выражением, так как он содержит только допустимые символы. Для более надежной проверки вам нужно будет написать что-то, чтобы проанализировать их ввод в соответствующую форму и посмотреть, можно ли запускать их на том, что они набирают.

+0

все в порядке! Спасибо! .. Один вопрос. Как я могу заставить это работать для всех чисел? позволяет говорить пользовательские входы 3.56 * Q –

+0

@AleksChkadua, что заставляет вас думать, что еще не работает? – jonrsharpe

+0

Я был неправ. Он продолжал давать мне ошибку имени, но в третий раз, когда я его проверил, он ушел. Ха-ха. благодаря! –

1

Предполагая, что вам нужно выражение питона в aStringFunctionMB вы можете оценить его в контролируемом пространстве имен исключений и поймать:

try: 
eval(aStringFunctionMB, {}, {"Q": 1}) 
astr = aStringFunctionMB 
except (NameError, SyntaxError): 
print "Please try again" 
Смежные вопросы