如何在Python 2.7中使raw_input容忍度更强大?

时间:2014-06-18 02:54:12

标签: python loops python-2.7 while-loop string-formatting

我是新来的和编程所以请放轻松。我知道几乎所有读这篇文章的人都比我知道得多,而且我可能做错了。

话虽这么说,这就是我要做的事情:

while True:
    arrival = raw_input('Arrival time? Example 8:30 \n')

    if  arrival != "%s%s:%s%s" % (range(0, 1), range(0, 10), range(0, 7), range(0, 10):

        arrival = raw_input('Follow the example: 8:30 \n)
        break

    elif arrival == "q":
        print "escape velocity reached!!!"
        return 0

“if”语句没有正确的语法,我甚至不知道这是否应该/将要首先编写此代码。基本上,我希望用户输入格式为1:11或11:11,否则我的代码会中断。请忽略elif,它正好在我测试时打破循环。

主要问题:

  1. 如何修复此代码或实现此代码背后的想法?
  2. 相关问题:

    1. 如何让python接受“正确”格式化字符串(XX:XX或X:XX)的许多不同组合?

    2. 有什么方法可以强迫某人在特定格式的容差范围内输入数据或提高raw_input容差?

    3. 有什么更好的方法来完成上述所有方法,还是有更好的方法来解决这个问题?

    4. 提前谢谢!

      P.S。

      1. 我知道获得一个好答案的唯一方法就是提出一个好问题......关于更好的问题格式的任何提示都会受到赞赏。

3 个答案:

答案 0 :(得分:3)

我将如何做到这一点:

  • 使用time.strptime来解析时间。格式字符串'%H:%M'可以正常使用 例如,您可以更具体或尝试支持多种格式 如果你需要。
  • 使用try/except处理无法正确解析的输入。 strptime会提出 如果格式不匹配,则为ValueError,因此您使用except来处理
  • 一旦我们有了可以解析的时间,就将time_ok标志设置为True(因此退出while循环)。

代码:

import time

time_ok = False
while not time_ok:
    arrival = raw_input('Arrival time? Example 8:30 \n')
    if arrival == 'q':
        print("Exiting.")
        break
    # Try to parse the entered time
    try:
        time_data = time.strptime(arrival, '%H:%M')
        time_ok = True
    # If the format doesn't match, print a warning
    # and go back through the while loop
    except ValueError:
        print('Follow the example: 8:30 \n')

hours, minutes = time_data.tm_hour, time_data.tm_min
print(hours, minutes)

答案 1 :(得分:1)

如果我理解你,你希望人们输入从0:00到11:59的时间。您所要做的就是以下

while True:
    arrival = raw_input("Please enter a time in the format hr:min (such as 8:30)")
    if ":" not in arrival:
        print("Please enter a time in the format hour:minute")
        continue
    else:
        arrival_list = arrival.split(":")
        if (int(arrival_list[0]) not in range(12)) or
           (int(arrival_list[1]) not in range(60)):
            print("Please enter a valid hour from 0-12 and a valid minute from 0-59")
        else: 
            break

这样可以保持循环,直到您将格式化的时间作为输入。

从整体编程的角度来看,我认为使用time模块可能更好,但我试图将其保持在我估计的技能水平。

答案 2 :(得分:1)

您需要使用正则表达式来匹配输入:

import re

format_ok = False
while format_ok:
    arrival = raw_input('Arrival time? Example 8:30 \n')
    if re.match("\d{1,2}:\d{2}", arrival):
        #string format is OK - break the loop
        format_ok = True