Сопоставьте даты и час, используя Python регулярные выражения - PullRequest
0 голосов
/ 08 мая 2020

Я хочу сопоставить даты и часы в следующем формате:

17/05/2009 8:15
17/5/2009 08:15
17.05.2009 8:15
17-05-2009 8:15
17/05/2009 8:15:00

pat = "^([0]?[1-9]|[1|2][0-9]|[3][0|1])[./-]([0]?[1-9]|[1][0-2])[./-]([0-9]{4}|[0-9]{2})$" 

Я использовал этот шаблон прямо сейчас, но он не включает формат часов. Как я могу записать в этот шаблон одновременно форматы даты и времени?

Спасибо

Ответы [ 2 ]

2 голосов
/ 08 мая 2020

Этот шаблон регулярного выражения немного трудно читать, что затруднит его расширение. Я мог бы предложить вместо этого использовать datetime.strptime:

from datetime import datetime

dates = [
  '17/05/2009 8:15',
  '17/5/2009 08:15',
  '17.05.2009 8:15',
  '17-05-2009 8:15',
  '17/05/2009 8:15:00',
]

def parse_date(date: str) -> datetime:
    for fmt in [
        "%d/%m/%Y %H:%M",
        "%d.%m.%Y %H:%M",
        "%d-%m-%Y %H:%M",
        "%d/%m/%Y %H:%M:%S",
    ]:
        try:
            return datetime.strptime(date, fmt)
        except ValueError:
            continue
    raise ValueError(f"Couldn't parse '{date}'!")

datetimes = [parse_date(date) for date in dates]

При таком подходе легко добавлять новые строки fmt и легко ловить дыры, так как вы получите ValueError каждый раз, когда вы вводите дата, не соответствующая ни одному из этих форматов.

0 голосов
/ 08 мая 2020

Если вы хотите, чтобы в вашем формате было обязательное время, вы можете использовать:

^([0]?[1-9]|[1|2][0-9]|[3][0|1])[.\/-]([0]?[1-9]|[1][0-2])[.\/-]([0-9]{4}|[0-9]{2})\s+([01]?\d|2[0-3]):([0-5]?\d)(:[0-5]?\d)?$

Если вы хотите, чтобы время было необязательным, вы можете использовать:

^([0]?[1-9]|[1|2][0-9]|[3][0|1])[.\/-]([0]?[1-9]|[1][0-2])[.\/-]([0-9]{4}|[0-9]{2})(\s+([01]?\d|2[0-3]):([0-5]?\d)(:[0-5]?\d)?)?$

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

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

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