извлекать час из строки _ непонятный формат - PullRequest
0 голосов
/ 27 января 2019

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

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

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

\ d +? (:)

(\ d +:)

(\ d +) *:

Ответы [ 3 ]

0 голосов
/ 27 января 2019

Регулярные выражения - не всегда лучший способ справиться со строками, представляющими даты, особенно если вы не можете полагаться на согласованность входного формата.Вместо этого используйте специализированный парсер:

>>> 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 не входит в стандартную библиотеку, но его стоит загрузить.

0 голосов
/ 27 января 2019

Во-первых, это то, что не так с вашими регулярными выражениями:

  • \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)

Теперь у вас есть полный объект datetime, и вы можете извлечь .hour, если хотите.

0 голосов
/ 27 января 2019
\d+(?=:)

Демо

Вам не нужно совпадать с :, но нужно проверить его.Так что используйте Позитивный Lookahead (?=:).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...