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']}") if valido: return { 'letrainicio': match.group('letrainicio'), 'numero': match.group('numero'), 'letrafinal': match.group('letrafinal'), } return None elif match and not match['letrainicio']: valido = comprobarLetra(f"{match['numero']}{match['letrafinal']}") if valido: return { 'numero': match['numero'], 'letrafinal': match.group('letrafinal'), } return None 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 decimalGrado(numero): a = float(numero) grados = int(numero) b = a - grados minutos = int(b*60) c = b*60-minutos segundos = int(c*60) return grados,minutos,segundos def gradoDecimal(grados,minutos,segundos): a = float(segundos)/3600 + float(minutos)/60 + float(grados) return a def coord(cadena, form=1): R = r"( *(?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(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(W|E)) *)|( *((?P[+|\-| ])(?P(([1-8]?[0-9])\.\d+)|90)) *, *((?P[+|\-| ])(?P([1][1-7][1-9]\.\d+)|([1-8]?[0-9]\.\d+))|90) *)" P = re.compile( R ) if P.fullmatch(cadena): M = P.fullmatch(cadena) if M.group("Grados1"): grados1 = M.group("Grados1") grados2 = M.group("Grados2") minutos1 = M.group("Minutos1") minutos2 = M.group("Minutos2") segundos1 = M.group("Segundos1") segundos2 = M.group("Segundos2") letra1 = M.group("Letra1") letra2 = M.group("Letra2") num1 = gradoDecimal(grados1,minutos1,segundos1) num2 = gradoDecimal(grados2,minutos2,segundos2) if letra1 == 'N': simb1 = '+' else: simb1 = '-' if letra2== 'E': simb2 = '+' else: simb2 = '-' else: num1 = float(M.group("Coord1")) num2 = float(M.group("Coord2")) simb1 = M.group("Signo1") simb2 = M.group("Signo2") if form == 1: return f'{simb1}{round(num1,4)}, {simb2}{round(num2,4)}' elif form == 2: grados1, minutos1, segundos1= decimalGrado(num1) grados2, minutos2, segundos2 = decimalGrado(num2) if simb1 == '+': letra1 = 'N' else: letra1 = 'S' if simb2 == '+': letra2 = 'E' else: letra2 = 'W' return f'{grados1}º {minutos1}\' {segundos1:}.0000" {letra1}, {grados2}º {minutos2}\' {segundos2}.0000" {letra2}' elif form == 3: grados1, minutos1, segundos1 = decimalGrado(num1) grados2, minutos2, segundos2 = decimalGrado(num2) if simb1 == '+': letra1 = 'N' else: letra1 = 'S' if simb2 == '+': letra2 = 'E' else: letra2 = 'W' return f'{grados1:0>3}{minutos1:0>2}{segundos1:0>2}.0000{letra1}{grados2:0>3}{minutos2:0>2}{segundos2:0>2}.0000{letra2}' else: 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()) coordenadas = coord(coordenadas.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 main(): print(validarTelefono("623-121-153")) print(validarDni("48755850-J")) print(validarDni("Z9876543-A")) print(validarInstante("october 12, 1925 1:12 pm")) l = open("log.txt", encoding="utf-8") for linea in l.readlines(): pass # print(validarEntrada(linea.strip())) # n, sphone, stime, snif arg_prueba = "-sphone 123456789 telefonos -stime 11:11:11 11:11:12 tiempos -n normalizar -snif 12345678B fichero" argumentos = r"(?P-sphone (?P\S*) (?P\S*))|(?P-stime (?P\S*) (?P\S*) (?P\S*))|(?P-n (?P\S*))|(?P-snif (?P\S*) (?P\S*))" A = re.compile(argumentos) match = A.finditer(arg_prueba) argv = sys.argv try: if '-n' in argv: fichero = argv[argv.index('-n') + 1] formato_fecha = int(argv[argv.index('-n') + 2]) formato_coordenadas = int(argv[argv.index('-n') + 3]) print("n") else: if '-sphone' in argv: telefono = int(argv[argv.index('-sphone') + 1]) fichero = argv[argv.index('-sphone') + 2] print("sphone") if '-snif' in argv: nif = argv[argv.index('-snif') + 1] fichero = argv[argv.index('-snif') + 2] if '-stime' in argv: desde = argv[argv.index('-stime') + 1] hasta = argv[argv.index('-stime') + 2] fichero = argv[argv.index('-stime') + 3] except Exception as e: print(e) if __name__ == "__main__": main()