Skip to main content
import re


def date_detector(text):
    date_pattern = re.compile('''
    ([12][0-9]|3[0-1]|0?[1-9])             # to detect days from 1 to 31
    ([./-])                                # to detect different separations
    (1[0-2]|0?[1-9])                       # to detect number of months
    ([./-])                                # to detect different seperations
    (2?1?[0-9][0-9][0-9])                  # to detect number of years from 1000-2999 years
     ''', re.VERBOSE)

    days = []
    months = []
    years = []
    dates = []
    for date in date_pattern.findall(text):
        days.append(int(date[0]))
        months.append(int(date[2]))
        years.append(int(date[4]))

    for num in range(len(days)):

    # appending dates in a list that dont need any filtering to detect wrong dates
        if months[num] not in (2, 4, 6, 9, 11):
            dates.append([days[num], months[num], years[num]])

    # detecting those dates with months that have only 30 days
        elif days[num] < 31 and months[num] in (4, 6, 9, 11):
            dates.append([days[num], months[num], years[num]])

    # filtering leap years with Feb months that have 29 days
        elif months[num] == 2 and days[num] == 29:
            if years[num] % 4 == 0:
                if years[num] % 100 == 0:
                    if years[num] % 400 == 0:
                        dates.append([days[num], months[num], years[num]])
                else:
                    dates.append([days[num], months[num], years[num]])

    # appending Feb dates that have less than 29 days
        elif months[num] == 2 and days[num] < 29:
            dates.append([days[num], months[num], years[num]])

    if len(dates) > 0:
        for date in dates:
            print(date)

data = '30-06-2012, 31-12-2012, 15-02-2002, 29-02-2004, 29-02-2002, 31-02-2004, 31-06-2012'

date_detector(data)

    import re


    def date_detector(text):
        date_pattern = re.compile('''
        ([12][0-9]|3[0-1]|0?[1-9])             # to detect days from 1 to 31
        ([./-])                                # to detect different separations
        (1[0-2]|0?[1-9])                       # to detect number of months
        ([./-])                                # to detect different seperations
        (2?1?[0-9][0-9][0-9])                  # to detect number of years from 1000-2999 years
         ''', re.VERBOSE)

        days = []
        months = []
        years = []
        dates = []
        for date in date_pattern.findall(text):
            days.append(int(date[0]))
            months.append(int(date[2]))
            years.append(int(date[4]))

        for num in range(len(days)):

        # appending dates in a list that dont need any filtering to detect wrong dates
            if months[num] not in (2, 4, 6, 9, 11):
                dates.append([days[num], months[num], years[num]])

        # detecting those dates with months that have only 30 days
            elif days[num] < 31 and months[num] in (4, 6, 9, 11):
                dates.append([days[num], months[num], years[num]])

        # filtering leap years with Feb months that have 29 days
            elif months[num] == 2 and days[num] == 29:
                if years[num] % 4 == 0:
                    if years[num] % 100 == 0:
                        if years[num] % 400 == 0:
                            dates.append([days[num], months[num], years[num]])
                    else:
                        dates.append([days[num], months[num], years[num]])

        # appending Feb dates that have less than 29 days
            elif months[num] == 2 and days[num] < 29:
                dates.append([days[num], months[num], years[num]])

        if len(dates) > 0:
            for date in dates:
                print(date)


data = '30-06-2012, 31-12-2012, 15-02-2002, 29-02-2004, 29-02-2002, 31-02-2004, 31-06-2012'

date_detector(data)
```
import re


def date_detector(text):
    date_pattern = re.compile('''
    ([12][0-9]|3[0-1]|0?[1-9])             # to detect days from 1 to 31
    ([./-])                                # to detect different separations
    (1[0-2]|0?[1-9])                       # to detect number of months
    ([./-])                                # to detect different seperations
    (2?1?[0-9][0-9][0-9])                  # to detect number of years from 1000-2999 years
     ''', re.VERBOSE)

    days = []
    months = []
    years = []
    dates = []
    for date in date_pattern.findall(text):
        days.append(int(date[0]))
        months.append(int(date[2]))
        years.append(int(date[4]))

    for num in range(len(days)):

    # appending dates in a list that dont need any filtering to detect wrong dates
        if months[num] not in (2, 4, 6, 9, 11):
            dates.append([days[num], months[num], years[num]])

    # detecting those dates with months that have only 30 days
        elif days[num] < 31 and months[num] in (4, 6, 9, 11):
            dates.append([days[num], months[num], years[num]])

    # filtering leap years with Feb months that have 29 days
        elif months[num] == 2 and days[num] == 29:
            if years[num] % 4 == 0:
                if years[num] % 100 == 0:
                    if years[num] % 400 == 0:
                        dates.append([days[num], months[num], years[num]])
                else:
                    dates.append([days[num], months[num], years[num]])

    # appending Feb dates that have less than 29 days
        elif months[num] == 2 and days[num] < 29:
            dates.append([days[num], months[num], years[num]])

    if len(dates) > 0:
        for date in dates:
            print(date)

data = '30-06-2012, 31-12-2012, 15-02-2002, 29-02-2004, 29-02-2002, 31-02-2004, 31-06-2012'

date_detector(data)

    import re


    def date_detector(text):
        date_pattern = re.compile('''
        ([12][0-9]|3[0-1]|0?[1-9])             # to detect days from 1 to 31
        ([./-])                                # to detect different separations
        (1[0-2]|0?[1-9])                       # to detect number of months
        ([./-])                                # to detect different seperations
        (2?1?[0-9][0-9][0-9])                  # to detect number of years from 1000-2999 years
         ''', re.VERBOSE)

        days = []
        months = []
        years = []
        dates = []
        for date in date_pattern.findall(text):
            days.append(int(date[0]))
            months.append(int(date[2]))
            years.append(int(date[4]))

        for num in range(len(days)):

        # appending dates in a list that dont need any filtering to detect wrong dates
            if months[num] not in (2, 4, 6, 9, 11):
                dates.append([days[num], months[num], years[num]])

        # detecting those dates with months that have only 30 days
            elif days[num] < 31 and months[num] in (4, 6, 9, 11):
                dates.append([days[num], months[num], years[num]])

        # filtering leap years with Feb months that have 29 days
            elif months[num] == 2 and days[num] == 29:
                if years[num] % 4 == 0:
                    if years[num] % 100 == 0:
                        if years[num] % 400 == 0:
                            dates.append([days[num], months[num], years[num]])
                    else:
                        dates.append([days[num], months[num], years[num]])

        # appending Feb dates that have less than 29 days
            elif months[num] == 2 and days[num] < 29:
                dates.append([days[num], months[num], years[num]])

        if len(dates) > 0:
            for date in dates:
                print(date)


data = '30-06-2012, 31-12-2012, 15-02-2002, 29-02-2004, 29-02-2002, 31-02-2004, 31-06-2012'

date_detector(data)
```
Source Link

Date Detection with Python RegEx

its a practice project from "Automate the Boring stuff with Python" book. i am an intermediate level Python programmer and i tried to solve this problem with less code as possible. This code will not take any wrong date into consideration eg: 29-02-2002 will not be selected because 2002 is not a leap year and only leap years have 29th of feb. i did not add code to also detect dates with months written in words, i could do that too but i want to keep things simple for now and i also did not use pyperclip module to detect dates from copied text to clipboard because i dont want to confuse any beginner who also want to learn from watching my code. I want master programmers to review my code and if their is another way possible to detect dates then please post your solutions. Also i would appreciate any advice and positive criticism, so i know where i am standing right now and what i need to improve. Thanks. Code is as follows:

import re


def date_detector(text):
    date_pattern = re.compile('''
    ([12][0-9]|3[0-1]|0?[1-9])             # to detect days from 1 to 31
    ([./-])                                # to detect different separations
    (1[0-2]|0?[1-9])                       # to detect number of months
    ([./-])                                # to detect different seperations
    (2?1?[0-9][0-9][0-9])                  # to detect number of years from 1000-2999 years
     ''', re.VERBOSE)

    days = []
    months = []
    years = []
    dates = []
    for date in date_pattern.findall(text):
        days.append(int(date[0]))
        months.append(int(date[2]))
        years.append(int(date[4]))

    for num in range(len(days)):

    # appending dates in a list that dont need any filtering to detect wrong dates
        if months[num] not in (2, 4, 6, 9, 11):
            dates.append([days[num], months[num], years[num]])

    # detecting those dates with months that have only 30 days
        elif days[num] < 31 and months[num] in (4, 6, 9, 11):
            dates.append([days[num], months[num], years[num]])

    # filtering leap years with Feb months that have 29 days
        elif months[num] == 2 and days[num] == 29:
            if years[num] % 4 == 0:
                if years[num] % 100 == 0:
                    if years[num] % 400 == 0:
                        dates.append([days[num], months[num], years[num]])
                else:
                    dates.append([days[num], months[num], years[num]])

    # appending Feb dates that have less than 29 days
        elif months[num] == 2 and days[num] < 29:
            dates.append([days[num], months[num], years[num]])

    if len(dates) > 0:
        for date in dates:
            print(date)

data = '30-06-2012, 31-12-2012, 15-02-2002, 29-02-2004, 29-02-2002, 31-02-2004, 31-06-2012'

date_detector(data)