Python регулярное выражение для сопоставления дат - PullRequest
34 голосов
/ 17 января 2011

Какое регулярное выражение в Python я использую для сопоставления таких дат: «11/12/98»?

Ответы [ 4 ]

44 голосов
/ 17 января 2011

Вместо использования регулярных выражений обычно лучше проанализировать строку как datetime.datetime объект:

In [140]: datetime.datetime.strptime("11/12/98","%m/%d/%y")
Out[140]: datetime.datetime(1998, 11, 12, 0, 0)

In [141]: datetime.datetime.strptime("11/12/98","%d/%m/%y")
Out[141]: datetime.datetime(1998, 12, 11, 0, 0)

Затем вы можете получить доступ к дню, месяцу и году (а также часам, минутам и секундам) в качестве атрибутов объекта datetime.datetime:

In [143]: date.year
Out[143]: 1998

In [144]: date.month
Out[144]: 11

In [145]: date.day
Out[145]: 12

Чтобы проверить, соответствует ли последовательность цифр, разделенных прямой косой чертой, допустимой дате, вы можете использовать блок try..except. Неправильные даты будут повышать ValueError:

In [159]: try:
   .....:     datetime.datetime.strptime("99/99/99","%m/%d/%y")
   .....: except ValueError as err:
   .....:     print(err)
   .....:     
   .....:     
time data '99/99/99' does not match format '%m/%d/%y'

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

In [146]: import re
In [152]: match = re.search(r'(\d+/\d+/\d+)','The date is 11/12/98')

In [153]: match.group(1)
Out[153]: '11/12/98'

Конечно, недопустимые даты также будут совпадать:

In [154]: match = re.search(r'(\d+/\d+/\d+)','The date is 99/99/99')

In [155]: match.group(1)
Out[155]: '99/99/99'

Чтобы проверить, что match.group(1) возвращает правильную строку даты, вы можете затем проанализировать ее, используя datetime.datetime.strptime, как показано выше.

3 голосов
/ 14 ноября 2017

Я считаю, что приведенный ниже RE работает нормально для даты в следующем формате;

  1. 14-11-2017
  2. 14.11.2017
  3. 14 | 11 | 2017

Может принимать годс 2000-2099

Пожалуйста, не забудьте добавить $ в конце, если не принимаете, 14-11-201 или 20177

date="13-11-2017"

x=re.search("^([1-9] |1[0-9]| 2[0-9]|3[0-1])(.|-)([1-9] |1[0-2])(.|-|)20[0-9][0-9]$",date)

x.group()

выход = '13 -11-2017 '

2 голосов
/ 22 июля 2018

Используя это регулярное выражение, вы можете проверять различные типы образцов даты / времени, требуется лишь небольшое изменение.

^\d\d\d\d/(0?[1-9]|1[0-2])/(0?[1-9]|[12][0-9]|3[01]) (00|[0-9]|1[0-9]|2[0-3]):([0-9]|[0-5][0-9]):([0-9]|[0-5][0-9])$ -> подтвердить это: 2018/7/12 13: 00: 00

для вашего формата вы можете изменить его на:

^(0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[0-2])/\d\d$ -> подтверждает это: 11/12/98

1 голос
/ 08 августа 2018

Ну, насколько я понимаю, просто для сопоставления этого формата с заданной строкой я предпочитаю следующее регулярное выражение:

pattern='[0-9|/]+'

для более строгого сопоставления формата, работает следующее:

pattern='(?:[0-9]{2}/){2}[0-9]{2}'

Лично я не могу согласиться с ответом unutbu, поскольку иногда мы используем регулярное выражение для «поиска» и «извлечения», а не только для «проверки».

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