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:
-
- enero – 31 días
-
- Febrero: 28 días (se ignoran los años bisiestos)
-
- Marzo – 31 días
-
- Abril – 30 días
-
- Mayo – 31 días
-
- junio – 30 días
-
- julio – 31 días
-
- Agosto – 31 días
-
- Septiembre – 30 días
-
- Octubre – 31 días
-
- noviembre – 30 días
-
- 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")