我有一个聊天机器人,它接受来自用户的时间字符串,例如:
10:00
8pm
3:45am
4am
但是有时候我会像22:40 pm
这样的军事时间。我想克服这个问题,不打扰用户,请告知如何解决时间?我在用:
from dateutil.parser import parse
parse(time)
但是我遇到一个错误,它无法解析22:40 pm
。
问题来源:stackoverflow
假设加到12:59以后的时间时,总是在am / pm的指定上是错误的(22:40 pm在某种程度上比22:40 am少了“错误”),则可以进行一些字符串切片,测试如果前几个数字可能是无效的时间,则在末尾删除该名称。
但是,在适当的正则表达式下,总是在12:59以后的时间删除am / pm
会更容易:
((?<=(?!10|11|12)[12]\d:\d\d))[ap]m
这与am
和pm
匹配(将被一个空字符串'
代替),但是仅在以一系列小数点开头的情况下使用1 \ d:\ d \ d或
2 \ d:\ d \ d(总范围为10:00到29:99)。这是一个积极的发现:其内部的模式必须出现在匹配的模式
am/
pm` 之前。
(1) am or pm
(2) <=dd:dd
(3) !>10,11,or 12
22:40am
但是当这些小数点的第一对值是10
,11
或12
中的一个时,它们是正确的时间(因为10:20 am
只是10:20
;10:20 pm
是22:20
;12:30 am
等于0:30
)。因为它们是正确的,所以不需要删除“ am”和“ pm”,因此它们被正向查找中的对象排除在了后面的内部进一步的负向查找中。这是一个负面的前瞻性,因此匹配意味着失败,而不是成功。
(regex101.com上的交互式示例)
完整代码:
from dateutil.parser import parse
import re
for time in ['3:40', '3:40am', '3:40pm',
'03:40', '03:40am', '03:40pm',
'12:40', '12:40am', '12:40pm',
'13:40', '13:40am', '13:40pm',
'22:40', '22:40am', '22:40pm']:
time = re.sub(r'((?<=(?!10|11|12)[12]\d:\d\d))[ap]m', '', time)
print (time, parse(time).time())
哪个输出
3:40 03:40:00
3:40am 03:40:00
3:40pm 15:40:00
03:40 03:40:00
03:40am 03:40:00
03:40pm 15:40:00
12:40 12:40:00
12:40am 00:40:00
12:40pm 12:40:00
13:40 13:40:00
13:40 13:40:00
13:40 13:40:00
22:40 22:40:00
22:40 22:40:00
22:40 22:40:00
回答来源:stackoverflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。