Cómo escribir una expresión common de fecha válida en Python


El reto

Su tarea es escribir una expresión common (regex) que coincida con una cadena solo si contiene al menos una fecha válida, en el formato (mm-dd) (es decir, un mes de dos dígitos, seguido de un guión, seguido de una fecha de dos dígitos, entre corchetes).

Debe suponer que el año en cuestión es no Un año bisiesto. Por lo tanto, el número de días que debe tener cada mes son los siguientes:

    1. enero – 31 días
    1. Febrero: 28 días (se ignoran los años bisiestos)
    1. Marzo – 31 días
    1. Abril – 30 días
    1. Mayo – 31 días
    1. junio – 30 días
    1. julio – 31 días
    1. Agosto – 31 días
    1. Septiembre – 30 días
    1. Octubre – 31 días
    1. noviembre – 30 días
    1. diciembre – 31 días

Todo el texto fuera de una fecha válida se puede ignorar, incluidos otros inválido fechas.

Ejemplos

"(01-23)" # January twenty third is a legitimate date
"(02-31)" # February thirty first is an invalid date
"(02-16)" # legitimate
"( 6-03)" # invalid format
"ignored (08-11) ignored" # legitimate
"(3) (12-04) (09-tenth)" # December 4th is a legitimate date

La solución en código Python

Opción 1:

import re

valid_date = re.compile(r"(("
    # Jan, Mar, Might, Jul, Aug, Oct, Dec: 31 days
    "(0(13578)|1(02))-(0(1-9)|(12)d|3(01))|"
    # Feb: 28 days
    "02-(0(1-9)|1d|2(0-8))|"
    # Apr, Jun, Sep, Nov: 30 days
    "(0(469)|11)-(0(1-9)|(12)d|30)"
    "))")

Opcion 2:

import datetime
from re import compile

class check_date(object):

    def __init__(self):
        self._rgxp = compile(r'(?P<date>(d{2}-d{2}))')

    def search(self, string):
        date = None
        search_date = self._rgxp.search(string)
        attempt:
            date = datetime.datetime.strptime(search_date.group('date'), "(%m-%d)")
        besides BaseException:
            cross

        if date: return date.date()


valid_date = check_date()

Opción 3:

valid_date = compile('(((?!02-(?:29|30))(?:0(1-9)|1(012))-(?:0(1-9)|1(0-9)|2(0-9)|30)|(?:0(13578)|1(02))-31))')

Casos de prueba para validar nuestra solución

take a look at.describe("Primary checks")
take a look at.anticipate(valid_date.search("(01-23)")!=None, "January twenty third is a legitimate date")
take a look at.anticipate(valid_date.search("(02-31)")==None, "February thirty first is an invalid date")
take a look at.anticipate(valid_date.search("(02-16)")!=None , "legitimate")
take a look at.anticipate(valid_date.search("( 6-03)")==None, "invalid format")
take a look at.anticipate(valid_date.search("ignored (08-11) ignored")!=None, "legitimate")
take a look at.anticipate(valid_date.search("(3) (12-04) (09-tenth)")!=None, "December 4th is a legitimate date")
take a look at.anticipate(valid_date.search("(02-00)")==None, "invalid format")
take a look at.anticipate(valid_date.search("(((08-29)))")!=None, "legitimate")
take a look at.anticipate(valid_date.search("(13-02)")==None, "invalid format")
take a look at.anticipate(valid_date.search("(02-(08-11)04)")!=None, "legitimate")

Related Articles

Tendencias de la industria SaaS en análisis en tiempo actual

Estamos viendo un gran crecimiento en el análisis en tiempo...

Comments

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Same Category

Tendencias de la industria SaaS en análisis en tiempo actual

Estamos viendo un gran crecimiento en el análisis...

🍿 Qué esperar de Google I/O 2023

👋 ¡Buenos días! Todavía estoy desconectado del...
spot_img

Stay in touch!

Follow our Instagram