如何在python中处理复杂的用户输入



我是一个相当新的python用户,正在处理一个项目,该项目将被那些不太了解python对输入有多挑剔的人使用。对于这个程序,我需要得到用户输入,告诉我视频的长度(分秒(,然后我需要从这个长度中减去1分8秒,然后打印出来。有没有办法处理输入,比如"5分30秒"?

一种可能性是检查用户输入中的每个子字符串,并将其分配给值:

s = input("video length? ")
minutes, seconds = [int(x) for x in s.split() if x.isdigit()]

如果需要,强制转换int(x)会将它们保存为整数:

print(minutes) # 5
print(seconds) # 30

或者正则表达式的解决方案可能是:

import re
minutes, seconds = map(int, re.findall('d+', s))
print(minutes) # 5 
print(seconds) # 30

现在您有了执行结果时间计算的值:

import datetime
# here, 100,1,1 are just placeholder values for year, month, day that are required to create a datetime object 
usertime = datetime.datetime(100,1,1, minute=minutes, second=seconds)
calculation = usertime - datetime.timedelta(minutes=1, seconds=8)

现在,您可以随心所欲地显示时间计算的结果:

print('{minutes} minutes and {seconds} seconds'.format(minutes=calculation.minute, seconds=calculation.second))
# 4 minutes and 22 seconds

如果格式始终相同(但可能不会(,则可以使用正则表达式,然后将适当的字符串转换为整数/双精度。

我认为你做得不对。最好有两个单独的输入字段,只接受整数。一个代表分钟,一个代表秒。如果您想要更高的精度(即毫秒(,那么只需包含另一个输入字段。

这里的主要问题是接受输入的格式。您可以强制用户仅以一种格式输入时间,例如小时:分钟:秒,在这种情况下,下面的代码将计算总秒数:

inp = input('Video duration: ').split(':')
hours = 0
mins = 0
secs = 0
if len(inp) >= 3:
hours = int(inp[-3])
if len(inp) >= 2:
mins = int(inp[-2])
secs = int(inp[-1])
total_secs = hours * 3600 + mins * 60 + secs - 68

我过于简化了代码,它不能避免用户错误和边缘情况

您可以尝试:

import re
from datetime import datetime, timedelta
question = "How long is the video (mm:ss)? "
how_long = input(question).strip()
while not re.match(r"^[0-5]?d:[0-5]?d$", how_long): # regex to check if mm:ss digits are in range 0-5
how_long = input("Wrong format. " + question).strip()
mm_ss = how_long.split(":")
how_long_obj = datetime.strptime(f"{mm_ss[0]}:{mm_ss[1]}", '%M:%S')
print(f"{how_long_obj - timedelta(seconds=68):%M:%S}")

输出:

How long is the video (mm:ss)? 22:33
21:25

Python3演示-(请打开交互模式On(

相关内容

  • 没有找到相关文章

最新更新