даты совпадения с использованием регулярных выражений Python - PullRequest
12 голосов
/ 02 апреля 2012

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

2010-08-27, 2010/08/27

Сейчас я не очень разборчив в том, что дата действительно выполнима, но просто в правильном формате.

, скажите, пожалуйста, регулярное выражение для этого.

Спасибо

Ответы [ 4 ]

22 голосов
/ 02 апреля 2012

Вы можете использовать модуль datetime для разбора дат:

import datetime

print datetime.datetime.strptime('2010-08-27', '%Y-%m-%d')
print datetime.datetime.strptime('2010-15-27', '%Y-%m-%d')

Выход:

2010-08-27 00:00:00
Traceback (most recent call last):
  File "./x.py", line 6, in <module>
    print datetime.datetime.strptime('2010-15-27', '%Y-%m-%d')
  File "/usr/lib/python2.7/_strptime.py", line 325, in _strptime
    (data_string, format))
ValueError: time data '2010-15-27' does not match format '%Y-%m-%d'

Так что ловя ValueError скажет вам, если дата совпадает:

def valid_date(datestring):
    try:
        datetime.datetime.strptime(datestring, '%Y-%m-%d')
        return True
    except ValueError:
        return False

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

import datetime
import re

def valid_date(datestring):
        try:
                mat=re.match('(\d{2})[/.-](\d{2})[/.-](\d{4})$', datestring)
                if mat is not None:
                        datetime.datetime(*(map(int, mat.groups()[-1::-1])))
                        return True
        except ValueError:
                pass
        return False
12 голосов
/ 02 апреля 2012

Вы можете использовать этот код:

import re

# regular expression to match dates in format: 2010-08-27 and 2010/08/27 
# date_reg_exp = re.compile('(\d+[-/]\d+[-/]\d+)')

обновленное регулярное выражение ниже:

# regular expression to match dates in format: 2010-08-27 and 2010/08/27
# and with mixed separators 2010/08-27
# date_reg_exp = re.compile('\d{4}[-/]\d{2}[-/]\d{2}')

# if separators should not be mixed use backreference:
date_reg_exp = re.compile('\d{4}(?P<sep>[-/])\d{2}(?P=sep)\d{2}')

# a string to test the regular expression above
test_str= """
     fsf2010/08/27sdfsdfsd
     dsf sfds f2010/08/26 fsdf 
     asdsds 2009-02-02 afdf
     """
# finds all the matches of the regular expression and
# returns a list containing them
matches_list=date_reg_exp.findall(test_str)

# iterates the matching list and prints all the matches
for match in matches_list:
  print match
4 голосов
/ 02 апреля 2012

Используйте модуль datetime. Вот регулярное выражение для знания, хотя вы не должны его использовать:

r'\d{4}[-/]\d{2}[-/]\d{2}'
2 голосов
/ 02 апреля 2012

Пакет dateutil имеет довольно умный парсер дат. Он анализирует широкий спектр форматов даты. http://pypi.python.org/pypi/python-dateutil

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