Mic*_*elR 7 python date python-2.7
我有一个问题,我应该以10:10:10
(hh:mm:ss)或10:10
(mm:ss)或10
(ss)的形式获得用户输入.现在我需要检查以下参数:
mm:ss
那么秒被限制为0..59并且分钟是无限的.hh:mm:ss
那么秒和分钟都限制在0..59,而小时是无限的.然后返回一个TimeDelta对象.
天真的方法是编写乘法if
语句来检查所有这些.但我正在寻找一种更顺畅的方式.
val = "11:66:11"
try:
val = map(int, val.split(':'))
except ValueError:
return False
if len(val) == 1:
return val
if len(val) == 2:
if val[1] > 59:
print "Bad seconds"
return False
if len(val) == 3:
if val[2] > 59 or val[1] >59:
print "Bad seconds / minutes"
return False
while len(val) < 3:
split.insert(0,0)
return = timedelta(hours=split[0],minutes=split[1],seconds=split[2])
Run Code Online (Sandbox Code Playgroud)
在这里使用正则表达式怎么样:
import re
import datetime
pattern = re.compile(r'^(\d+)(?::([0-5]?\d)(?::([0-5]?\d))?)?$')
def str2seconds(val):
match = pattern.match(val)
if not match:
raise ValueError("Invalid input: %s" % val)
else:
result = 0
for i in match.groups():
if i is not None:
result *= 60
result += int(i)
return datetime.timedelta(seconds=result)
Run Code Online (Sandbox Code Playgroud)
例:
>>> print(str2seconds('255'))
0:04:15
>>> print(str2seconds('255:25'))
4:15:25
>>> print(str2seconds('255:25:25'))
10 days, 15:25:25
>>> print(str2seconds('255:25:25:255'))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "y.py", line 8, in str2seconds
raise ValueError("Invalid input: %s" % val)
ValueError: Invalid input: 255:25:25:255
>>> print(str2seconds('255:25:60'))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "y.py", line 8, in str2seconds
raise ValueError("Invalid input: %s" % val)
ValueError: Invalid input: 255:25:60
Run Code Online (Sandbox Code Playgroud)
正则表达式部分:
^
:字符串的开头(\d+)
:1-n位数,捕获为组1(?::([0-5]?\d)(?::([0-5]?\d))?)?
可选部分:
(?:...)
是一个非捕获组:
匹配文字 :
([0-5]?\d)
一个可选的数字0-5,后跟一个数字,作为第2组捕获(?::([0-5]?\d))?
可选地匹配第二个:
后跟一个可选数字0-5后跟一个数字; 并将数字捕获到组3中$
匹配字符串的结尾.严格地说,^
在开始时没有必要在开始时match
锚定比赛; 但是这$
是必要的,否则匹配不会锚定在字符串的末尾!(Python 3.4添加了re.fullmatch
修复它.)这match.groups()
将是3项的元组; 不匹配的组将作为返回None
.
归档时间: |
|
查看次数: |
635 次 |
最近记录: |