将用户的选择与正则表达式匹配

时间:2014-03-27 18:11:55

标签: python regex

我之前已经阅读过很多关于正则表达式的问题'我已经在python网站上浏览了他们的文档。我过去也成功地使用了它们,但是我不能让它们在这个例子中工作,这就是我现在发布的原因。

我试图在python中制作一台自动售货机,到目前为止我们已经提出了这个代码来显示和选择你想要购买的产品。 (显然它现在有点粗糙:))

但是我遇到了正则表达式的问题。我想确保只输入数字1 - 5,否则它会继续请求输入。

我目前的尝试:

删除所有正则表达式'并在最后添加一个else。这适用于不是1-5的数字,但在我输入字符/字母时会返回错误。所以我真的想使用正则表达式来限制只输入1-5而没有字母。

products = ["MarsBar:","Twix:","DoubleDecker:","Flake:","Revels:"]
prices = ["£1.00","£0.90","£1.20","£1.10","£1.30"]

for counter in range(4): print (counter + 1, products[counter],prices[counter])
#___________________________________________________________________________________
valid1 = 0
import re
while valid1 == 0:
    choice = (input("Please enter your choice between 1 and 5..."))
    valid = 1
    if not re.match("^[1-5]*$", choice):
        print("must be valid")
        valid1 = 0
    if choice == 1:
        valid1 = 1
        print (products[0])
    elif choice == 2:
        valid1 = 1
        print (products[1])
    elif choice == 3:
        valid1 = 1
        print (products[2])
    elif choice == 4:
        valid1 = 1
        print (products[3])
    elif choice == 5:
        valid1 = 1
        print (products[4])

print("Thankyou") 

4 个答案:

答案 0 :(得分:2)

在这里使用正则表达式就像使用超音速喷气机去上班一样。你发布的代码表明你开始编程,正则表达式是复杂的野兽。在你感觉更舒服之前,你应该避开它们。

尝试使用更简单的构造:

valid = False
while not valid:
    choice = input(...)
    valid  = choice in ('1', '2', '3', '4', '5')

print products[int(choice) - 1]

答案 1 :(得分:1)

首先,这不是Regex的好应用程序。如果是,你会使用[^12345],但不是,所以我们不会这样做。相反,这样做:

while True:
    try:
        choice = int(input("choice between 1-5: "))
        if choice not in range(1,6):
            raise ValueError
    except ValueError:
        print("Not a valid value")
    else:
        break

这是更好的,因为choice现在是一个整数,你根本不必设置valid1,只需重复选择。此外,由于它们对应于您返回的索引,因此只需使用该值而不是if/elif全部检查它们。

print(products[choice-1])

答案 2 :(得分:1)

“一个程序员曾经遇到过问题所以他决定使用正则表达式,现在他有两个问题” - 一个更聪明的人,然后我自己

我会做什么:

products = {1 : ['Twix', 1], 2 : ['Freddo', 1.50]}  # use a dictionary as a pseudo DB  
while True:
    try:
        choice = int(input(...))
        break
    except (ValueError, KeyError):  
    # ValueError exception will occur if a user enters an invlaid choice like a letter
    # KeyError will occur if the user enter a number that has no key, example if your keys are 1-5 and user enters a 7
        # handle error


print(products[choice])

如果您需要向自动售货机添加更多商品,使用字典可以省去编辑代码的麻烦。无论你在字典中添加多少项而不需要更改任何内容,此代码都可以正常工作。

答案 3 :(得分:0)

你在这里不需要正则表达式,你可以简单地说:

while True:
    choice = input("choice between 1-5: ")
    if choice in ['1','2','3','4','5']:
        break
    else:
        print("Not a valid value")

这个更紧凑,不需要被try... except块包围,因为它不会调用int(),并且每个@ Adam-Smith会冒险抛出ValueError回答。同上,空白或其他任何不是单个数字的东西。

如果你真的想要紧凑的代码:

    while True:
        choice = input("choice between 1-5: ")
        if choice in ['1','2','3','4','5']: break
        print("Not a valid value")