Извлечь час из строки _ неясный формат

этот вопрос, возможно, дублируется, но я не нашел точного решения для этого. У меня есть строка такого типа, которая включает дату и время.

"check_in": "10/25/2019 14:30"

Мне нужно извлечь из него час, но это не всегда допустимый формат. До сих пор я пробовал этот шаблон, но он включает символ «:».

\d+?(:)

(\d+:)

(\d+)*:

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
764
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

\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, если хотите.

Другие вопросы по теме