开发者社区> 问答> 正文

如何修复错误的输入时间Python?

我有一个聊天机器人,它接受来自用户的时间字符串,例如:

10:00
8pm
3:45am
4am

但是有时候我会像22:40 pm这样的军事时间。我想克服这个问题,不打扰用户,请告知如何解决时间?我在用:

from dateutil.parser import parse
parse(time)

但是我遇到一个错误,它无法解析22:40 pm

问题来源:stackoverflow

展开
收起
is大龙 2020-03-23 23:56:35 383 0
1 条回答
写回答
取消 提交回答
  • 假设加到12:59以后的时间时,总是在am / pm的指定上是错误的(22:40 pm在某种程度上比22:40 am少了“错误”),则可以进行一些字符串切片,测试如果前几个数字可能是无效的时间,则在末尾删除该名称。

    但是,在适当的正则表达式下,总是在12:59以后的时间删除am / pm会更容易:

    ((?<=(?!10|11|12)[12]\d:\d\d))[ap]m
    

    这与ampm匹配(将被一个空字符串'代替),但是仅在以一系列小数点开头的情况下使用1 \ d:\ d \ d2 \ d:\ d \ d(总范围为10:00到29:99)。这是一个积极的发现:其内部的模式必须出现在匹配的模式am/ pm` 之前。

     (1)       am or pm
     (2)  <=dd:dd
     (3)  !>10,11,or 12
          22:40am
    

    但是当这些小数点的第一对值是101112中的一个时,它们是正确的时间(因为10:20 am只是10:20;10:20 pm22: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

    2020-03-23 23:56:41
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载