Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python regex to match dates

Tags:

python

date

regex

What regular expression in Python do I use to match dates like this: "11/12/98"?

like image 538
clumpter Avatar asked Jan 17 '11 03:01

clumpter


People also ask

What is re match in Python?

Both return the first match of a substring found in the string, but re. match() searches only from the beginning of the string and return match object if found. But if a match of substring is found somewhere in the middle of the string, it returns none.


2 Answers

Instead of using regex, it is generally better to parse the string as a datetime.datetime object:

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) 

You could then access the day, month, and year (and hour, minutes, and seconds) as attributes of the datetime.datetime object:

In [143]: date.year Out[143]: 1998  In [144]: date.month Out[144]: 11  In [145]: date.day Out[145]: 12 

To test if a sequence of digits separated by forward-slashes represents a valid date, you could use a try..except block. Invalid dates will raise a 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' 

If you need to search a longer string for a date, you could use regex to search for digits separated by forward-slashes:

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' 

Of course, invalid dates will also match:

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' 

To check that match.group(1) returns a valid date string, you could then parsing it using datetime.datetime.strptime as shown above.

like image 106
unutbu Avatar answered Oct 13 '22 16:10

unutbu


I find the below RE working fine for Date in the following format;

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

It can accept year from 2000-2099

Please do not forget to add $ at the end,if not it accept 14-11-201 or 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'

like image 34
aditya Prakash Avatar answered Oct 13 '22 15:10

aditya Prakash