import regex as re import sys # -n: normaliza el fichero en pos[-n] + 1 con los formatos: # +34[numero] # formato 2 para instantes temporales # formato 3 para coordenadas # nif, producto y precio originales # se puede pasar f1 para el formato de las fechas y f2 para las coordenadas [param. opc.] # -sphone, -snif: filtran por teléfono y nif # -stime: filtran de una fecha hasta otra # -slocation: puntos extra # la salida aparece como campo1 ; campo2 ; campo3 ; ... # los errores de formato o sintaxis en los argumentos son exit N # los errores en el archivo se ignoran letras = ['T', 'R', 'W', 'A', 'G', 'M', 'Y', 'F', 'P', 'D', 'X', 'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'E'] reemplazo_nie = { 'X': 0, 'Y': 1, 'Z': 2, None: '', } def comprobarLetra(dni: str): num = int(dni[:-1]) letra = dni[-1] if letras[num % 23] != letra: return False else: return True t = r"(?P\d{3})-(?P\d{3})-(?P\d{3})" T = re.compile(t) def validarTelefono(telefono): match = T.match(telefono) if match is not None: return { 'parte1': match.group('parte1'), 'parte2': match.group('parte2'), 'parte3': match.group('parte3'), } return None d = r"(((?P[X-Z])*(?P\d{7}))|(?P\d{8}))-(?P[A-HJ-NP-TV-Z])" # cambiar, el nie son 7 D = re.compile(d, flags=re.I|re.M) def validarDni(dni): match = D.match(dni) if match and match['letrainicio']: valido = comprobarLetra(f"{reemplazo_nie[match['letrainicio']]}{match["numero"]}{match["letrafinal"]}") return { 'letrainicio': match.group('letrainicio'), 'numero': match.group('numero'), 'letrafinal': match.group('letrafinal'), } elif match and not match['letrainicio']: valido = comprobarLetra(f"{match["numero"]}{match["letrafinal"]}") return { 'numero': match['numero'], 'letrafinal': match.group('letrafinal'), } else: return None i = r"((?P0{3}[1-9]|\d{4})-(?P0\d|1[0-2])-(?P[0-2]\d|3[01])\s+(?P[0-1]\d|2[0-4]):(?P[0-5]\d))|((?Pjanuary|february|march|april|may|june|july|august|september|october|november|december)\s+(?P\d|[12]\d|3[01]),\s+(?P0{3}[1-9]|\d{4})\s+(?P[1-9]|1[0-2]):(?P[0-5]\d)\s+(?P[ap]m))|((?P[01]\d|2[0-3]):(?P[0-5]\d):(?P[0-5]\d)\s+(?P[0-2]\d|3[01])/(?P0\d|1[0-2])/(?P0{3}[1-9]|\d{4}))" I = re.compile(i, flags=re.IGNORECASE) def validarInstante(instante): match = I.match(instante) if match and not match['segundo']: return { 'anyo': match.group('anyo'), 'mes': match.group('mes'), 'dia': match.group('dia'), 'hora': match.group('hora'), 'minuto': match.group('minuto'), } elif match and match['segundo']: return { 'anyo': match.group('anyo'), 'mes': match.group('mes'), 'dia': match.group('dia'), 'hora': match.group('hora'), 'minuto': match.group('minuto'), 'segundo': match.group('segundo'), } return None def validarEntrada(entrada): telefono, dni, fecha, coordenadas, producto, coste = entrada.split(";") tel = validarTelefono(telefono.strip()) dni = validarDni(dni.strip()) fecha = validarInstante(fecha.strip()) valores = { 'telefono': tel, 'dni': dni, 'fecha': fecha, 'coordenadas': coordenadas, 'producto': producto, 'coste': coste, } for k in valores.keys(): if valores[k] is None: return None return valores def coord(): R = r"( *(?P([0-2][0-9][0-9])|(3[0-5][0-9]))(?P[0-6][0-9])gi(?P[0-6][0-9]\.\d{4})(?P[N|S])(?P([0-2][0-9][0-9])|(3[0-5][0-9]))(?P[0-6][0-9])(?P[0-6][0-9]\.\d{4})(?P[W|E]) *)|( *(?P((1[0-9][0-9])|(2[0-9][0-9])|(3[0-5][0-9])|\d{2}|\d{1}))° *(?P([0-5][0-9])|[0-9])' *(?P(([0-5][0-9])|[0-9])\.\d{4})\" *(?P(N|S)) *, *(?P((1[0-9][0-9])|(2[0-9][0-9])|(3[0-5][0-9])|\d{2}|\d{1}))° *(?P([0-5][0-9])|[0-9])' *(?P(([0-5][0-9])|[0-9])\.\d{4})\" *(?P(N|S)) *)|( *(?P[(+|\-| ](([1-8]?[0-9]\.\d+)|90)) *, *(?P[(+|\-| ](([1-8]?[0-9]\.\d+)|90)) *)" P = re.compile( R ) cadena = " 74°28' 5.0000\" S , 46°4' 12.0000\"E " if P.fullmatch(cadena): M = P.fullmatch(cadena) #f1 print(f'{M.group("Coord1")}, {M.group("Coord2")}') #f2 print(f'{M.group("Grados1")}º {M.group("Minutos1")}\' {M.group("Segundos1")}" {M.group("Letra1")}, {M.group("Grados2")}º {M.group("Minutos2")}\' {M.group("Segundos2")}" {M.group("Letra2")}') #f3 print(f'{M.group("Grados1"):0>3}{M.group("Minutos1"):0>2}{M.group("Segundos1"):0>7}{M.group("Letra1")}{M.group("Grados2"):0>3}{M.group("Minutos2"):0>2}{M.group("Segundos2"):0>7}{M.group("Letra2")}') else: print("No valido") ''' if P.fullmatch(cadena): M = P.fullmatch(cadena) print("Primera Coordenada: Grados: ",M.group("Grados1"), " minutos: ", M.group("Minutos1")," Segundos: ",M.group("Segundos1"), " letra: ", M.group("Letra1")) print("Segunda Coordenada: Grados: ",M.group("Grados2"), " minutos: ", M.group("Minutos2")," Segundos: ",M.group("Segundos2"), " letra: ", M.group("Letra2")) else: print("No valido") ''' def main(): print(validarTelefono("623-121-153")) print(validarDni("48755850-J")) print(validarDni("Z9876543-A")) print(validarInstante("october 12, 1925 1:12 pm")) coord() l = open("log.txt", encoding="utf-8") for linea in l.readlines(): print(validarEntrada(linea.strip())) argv = ' '.join([a for a in sys.argv[1:]]) # n, sphone, stime, snif arg_prueba = "-snif 12345678B fichero -sphone 123456789 telefonos -n normalizar -stime 11:11:11 11:11:12 tiempos" argumentos = r'(?P-sphone (?P\S*) (?P\S*))|(?P-stime (?P\S*) (?P\S*) (?P\S*))|(?Pn (?P\S*))|(?P-snif (?P\S*) (?P\S*))' A = re.compile(argumentos) match = A.match(arg_prueba) print(type(match)) if __name__ == "__main__": main()