Как исправить неверно введенное время Python? - PullRequest
0 голосов
/ 12 марта 2020

У меня есть чат-бот, который принимает временную строку от пользователя, например:

10:00
8pm
3:45am
4am

Но иногда я получаю военное время, например 22:40pm. Я хочу преодолеть эту проблему и не беспокоить пользователя, посоветуйте, пожалуйста, как можно исправить время? Я использую:

from dateutil.parser import parse
parse(time)

Но я получаю сообщение об ошибке, не могу разобрать 22:40pm.

1 Ответ

1 голос
/ 12 марта 2020

Предполагая, что обозначение am / pm всегда неверно (22:40pm как-то менее «неправильно», чем 22:40am) при добавлении во времена после 12:59, вы могли бы выполнить нарезку строк, проверить первые цифры, возможно, являются недопустимым временем, а затем удалите обозначение в конце, если оно там есть.

Но проще всегда удалить am/pm для времен после 12:59, с соответствующее регулярное выражение:

((?<=(?!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:20am это просто 10:20; 10:20pm это 22:20; 12:30am равно 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
...