Какое регулярное выражение в Python я использую для сопоставления таких дат: "11/12/98"?
Регулярное выражение Python для сопоставления дат
Ответ 1
Вместо использования регулярных выражений обычно лучше проанализировать строку как объект 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
как показано выше.
Ответ 2
Я считаю, что ниже RE работает нормально для Date в следующем формате;
- 14-11-2017
- 14.11.2017
- 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()
output = '13 -11-2017 '
Ответ 3
Используя это регулярное выражение, вы можете проверять различные типы образцов даты/времени, просто нужно внести небольшие изменения.
^\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
Ответ 4
Ну, насколько я понимаю, просто для соответствия этому формату в данной строке я предпочитаю это регулярное выражение:
pattern='[0-9|/]+'
для более строгого соответствия формату, работает следующее:
pattern='(?:[0-9]{2}/){2}[0-9]{2}'
Лично я не могу согласиться с unutbu ответом, поскольку иногда мы используем регулярное выражение для "поиска" и "извлечения", а не только "проверки".
Ответ 5
Иногда нам нужно получить дату из строки. Один пример с группировкой:
record = '1518-09-06 00:57 some-alphanumeric-charecter'
pattern_date_time = ([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}) .+
match = re.match(pattern_date_time, record)
if match is not None:
group = match.group()
date = group[0]
print(date) // outputs 1518-09-06 00:57