этот вопрос, возможно, дублируется, но я не нашел точного решения для этого. У меня есть строка такого типа, которая включает дату и время.
"check_in": "10/25/2019 14:30"
Мне нужно извлечь из него час, но это не всегда допустимый формат. До сих пор я пробовал этот шаблон, но он включает символ «:».
\d+?(:)
(\d+:)
(\d+)*:






\d+(?=:)
Вам не нужно совпадать с :, но нужно проверить его. Так что используйте Положительный прогноз(?=:).
Регулярные выражения не всегда являются лучшим способом работы со строками, представляющими даты, особенно если вы не можете полагаться на согласованность входного формата. Вместо этого используйте специализированный парсер:
>>> from dateutil import parser
>>> parser.parse("10/25/2019 14:30").hour
14
>>> parser.parse("10/25/2019 2:30 PM").hour
14
>>> parser.parse("2019-10-25T143000").hour
14
Модуля dateutil нет в стандартной библиотеке, но его стоит скачать.
Во-первых, вот что не так с вашими регулярными выражениями:
\d+?(:) - находит номер и столбец (14:) и помещает столбец в группу(\d+:) - находит номер и столбец (14:) и объединяет их в группу(\d+)*: - находит (опционально, из-за *) номер и столбец (14:) и помещает номер в группуИтак, последний может работать:
>>> match = re.search(r'(\d+)*:', "10/25/2019 14:30")
>>> match.group(0) # whole result
'14:'
>>> match.group(1) # just the number
'14'
Но опять же, это дало бы неверный результат (вместо поломки) на что-то вроде «время: 14:30», что затруднило бы отладку ошибки позже. Что вы хотите, так это использовать более строгий поиск, например. сопоставление всей строки и маркировка всех групп:
>>> regex = r'(?P<month>\d\d)/(?P<day>\d\d)/(?P<year>\d{4}) (?P<hour>\d\d):(?P<minute>\d\d)'
>>> re.search(regex, "10/25/2019 14:30").group('hour')
'14'
Другой, более простой и даже более безопасный способ — использовать strptime:
>>> import datetime
>>> datetime.datetime.strptime("10/25/2019 14:30", "%m/%d/%Y %H:%M")
datetime.datetime(2019, 10, 25, 14, 30)
Теперь у вас есть полный объект даты и времени, и вы можете извлечь .hour, если хотите.