2016-06-25 2 views
0

Я хочу использовать регулярное выражение для фильтрации пользовательского ввода на основе набора кортежей. Сообщение об ошибке должно быть возвращено, если пользовательский ввод не найден в set of tuples и не является an alphanumeric character. Я не могу получить доступ к кортежам в моем коде regex python. Итак, я прошел через src.items(), как использовать функцию escape, чтобы получить src.items(), чтобы внести свои значения, или, возможно, я не должен делать этого таким образом.с использованием python regex на кортежах для фильтрации пользовательских входов

Мой код:

import re 

direction = ('north', 'south', 'east', 'west', 'down', 'up', 'left', 'right', 'back') 
verb = ('go', 'stop', 'kill', 'eat') 
stop = ('the', 'in', 'of', 'from', 'at', 'it') 
noun = ('door', 'bear', 'princess', 'cabinet')  

src = {'direction': direction, 
     'verb': verb, 
     'stop': stop, 
     'noun': noun 
     } 

# use this to pick out error strings from user input 
    er = r"*[\W | src.items()]" 
    ep = re.compile(er, re.IGNORECASE) 

ответ

0

Это не хорошее место, чтобы использовать регулярные выражения, и это не что иное, как действительное регулярное выражение Python.

Вам лучше просто проверить, является ли вход пользователя (возможно, принудительным для нижнего регистра) равным любой из команд в цикле.

1

Во-первых, есть избыточность здесь:

сообщение об ошибке должно быть возвращено, если пользовательский ввод не найден в множество кортежей и не алфавитно-цифровой символ

Если пользовательский ввод находится в вашем наборе кортежей, как он может содержать символ nonalphanumeric? Также вы не указываете, проверяете ли вы отдельные слова или полные фразы одновременно.

Давайте попробуем другой подход. Во-первых, не используйте два уровня структуры данных, в которых они будут выполняться (т. Е. Просто словарь). Во-вторых, мы будем переключать кортежи на списки не по техническим причинам, а по семантическим (однородные -> списки, гетерогенные -> кортежи). И мы будем подбрасывать регулярное выражение на данный момент в пользу простого теста split() и in. Наконец, мы будем тестировать полные фразы:

vocabulary = { 
    'direction': ['north', 'south', 'east', 'west', 'down', 'up', 'left', 'right', 'back'], 
    'verb': ['go', 'stop', 'kill', 'eat'], 
    'stop': ['the', 'in', 'of', 'from', 'at', 'it'], 
    'noun': ['door', 'bear', 'princess', 'cabinet'] 
    } 

vocabulary_list = [word for sublist in vocabulary.values() for word in sublist] 

phrases = ["Go in the east door", "Stop at the cabinet", "Eat the bear", "Do my taxes"] 

# use this to pick out error strings from user input 
for phrase in phrases: 
    if any(term.lower() not in vocabulary_list for term in phrase.split()): 
     print phrase, "-> invalid" 
    else: 
     print phrase, "-> valid" 

ПРОИЗВОДИТ

Go in the east door -> valid 
Stop at the cabinet -> valid 
Eat the bear -> valid 
Do my taxes -> invalid 

Отсюда, возможно, учитывая, что позволяет некоторые puctuation как запятые и периоды, а просто лишить их, а не судить о них.

+0

Я тестирую полные фразы за раз. –

Смежные вопросы