patterns = [
r'(\d+) часов?',
r'в (\d+.?\d*) (утра|дня|вечера)',
r'в половину (\d+.?\d*)',
r'без (\d+) (\d+)',
r'ровно в (\d+.?\d*)',
r'без пяти (\d+)',
r'без десяти (\d+)',
r'без четверти (\d+)',
r'без двадцати (\d+)'
]
current_hour = datetime.now().hour
for pattern in patterns:
match = re.search(pattern, text)
if match:
groups = match.groups()
if groups[0]:
hour = int(groups[0])
elif groups[1]:
hour = float(groups[1])
if groups[2] == 'утра' and hour >= 6:
hour -= 12
elif groups[2] == 'вечера' and hour < 6:
hour += 12
elif groups[3]:
hour = int(groups[3])
minute = 30
elif groups[4]:
hour = int(groups[5])
minute = 60 - int(groups[4])
elif groups[6]:
hour = float(groups[6])
minute = 0
elif groups[7]:
hour = int(groups[8])
minute = 55
elif groups[9]:
hour = int(groups[10])
minute = 50
elif groups[11]:
hour = int(groups[12])
minute = 45
elif groups[13]:
hour = int(groups[14])
minute = 40
hour = hour if 0 <= hour <= 23 else (hour + 24) % 24
return datetime(2023, 9, 8, hour, minute).strftime('%H:%M')
return None
text = "Встретимся без пяти шесть"
print(extract_time(text)) # 17:55
Теперь добавлена поддержка "без пяти", "без десяти" и т.д. - парсится час и вычисляются соответствующие минуты.
Спасибо!
проверь ещё регексы, они слова не захватывают вроде без пяти шесть
Обсуждают сегодня