我正在尝试将用户命名的值放入一个稍后要使用的数组中。但是,到目前为止,我的代码无限循环......这就是我得到的:
def dates():
dates = []
user_input = raw_input("Please put folder with format yy.mm.dd: ")
while user_input != 'end':
if user_input == '%y.%m.%d':
dates.append(user_input)
else:
print "Please out folder in form yy.mm.dd or write 'end'"
print dates
新功能:
def date():
dates = []
user_input =raw_input("Please put folder with format yy.mm.dd: ")
pattern = re.compile('\d{2}.\d{2}.\d{2}')
if pattern.match(user_input):
dates.append(user_input)
elif user_input == 'end':
print 'Dates:'
else:
print "Use yy.mm.dd format or write 'end'"
return dates
答案 0 :(得分:2)
您的代码中存在两个问题,第一个问题:
user_input = raw_input("Please put folder with format yy.mm.dd: ")
此输入仅评估一次,因此要么进入无限循环,要么只添加一个字符串列表。
此外,
user_input == '%y.%m.%d'
此比较检查字符串相等性,而不是模式匹配。您有两个选项,首先使用正则表达式检查输入字符串的有效性:
pattern = re.compile('\d{2}.\d{2}.\d{2}')
if pattern.match(user_input):
pass # handle valid input
else:
pass # handle invalid input
此选项有一个缺点,因为您可以通过00
或>12
一个月,类似于大于31
等的那一天。
对我来说,首选的方法是使用EAFP方法并尝试创建datetime.date
对象。
year, month, day = user_input.split('.')
try:
date = datetime.date(int(year), int(month), int(day))
except ValueError:
pass # handle invalid input
else:
pass # handle valid input
答案 1 :(得分:1)
这是因为您从未在<{1}}循环中请求用户输入 。因此,它会不断评估您的第一个while
,并且您的用户永远不会有机会输入user_input
并突破循环。在'end'
循环中放置另一个raw_input
来电,而不是while
字符串,以便实际重新评估用户输入。这将确保如果格式正确,您的用户也将被提示进行其他输入。
另外,由于你有一个else
函数,如果这是函数的结尾,你应该dates()
你的结果,而不是return
。
最后,因为你的条件语句当前是唯一有效的匹配,你将拥有的是文字字符串。您需要使用正则表达式或实际模式匹配才能匹配有效输入。