Предполагая, что обозначение 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