Files
alf/sesion6.py
2025-12-09 11:09:08 +01:00

151 lines
6.3 KiB
Python

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<parte1>\d{3})-(?P<parte2>\d{3})-(?P<parte3>\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<letrainicio>[X-Z])*(?P<numero>\d{7}))|(?P<numero>\d{8}))-(?P<letrafinal>[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"((?P<anyo>0{3}[1-9]|\d{4})-(?P<mes>0\d|1[0-2])-(?P<dia>[0-2]\d|3[01])\s+(?P<hora>[0-1]\d|2[0-4]):(?P<minuto>[0-5]\d))|((?P<mes>january|february|march|april|may|june|july|august|september|october|november|december)\s+(?P<dia>\d|[12]\d|3[01]),\s+(?P<anyo>0{3}[1-9]|\d{4})\s+(?P<hora>[1-9]|1[0-2]):(?P<minuto>[0-5]\d)\s+(?P<segundo>[ap]m))|((?P<hora>[01]\d|2[0-3]):(?P<minuto>[0-5]\d):(?P<segundo>[0-5]\d)\s+(?P<dia>[0-2]\d|3[01])/(?P<mes>0\d|1[0-2])/(?P<anyo>0{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<Grados1>([0-2][0-9][0-9])|(3[0-5][0-9]))(?P<Minutos1>[0-6][0-9])gi(?P<Segundos1>[0-6][0-9]\.\d{4})(?P<Letra1>[N|S])(?P<Grados2>([0-2][0-9][0-9])|(3[0-5][0-9]))(?P<Minutos2>[0-6][0-9])(?P<Segundos2>[0-6][0-9]\.\d{4})(?P<Letra2>[W|E]) *)|( *(?P<Grados1>((1[0-9][0-9])|(2[0-9][0-9])|(3[0-5][0-9])|\d{2}|\d{1}))° *(?P<Minutos1>([0-5][0-9])|[0-9])' *(?P<Segundos1>(([0-5][0-9])|[0-9])\.\d{4})\" *(?P<Letra1>(N|S)) *, *(?P<Grados2>((1[0-9][0-9])|(2[0-9][0-9])|(3[0-5][0-9])|\d{2}|\d{1}))° *(?P<Minutos2>([0-5][0-9])|[0-9])' *(?P<Segundos2>(([0-5][0-9])|[0-9])\.\d{4})\" *(?P<Letra2>(N|S)) *)|( *(?P<Coord1>[(+|\-| ](([1-8]?[0-9]\.\d+)|90)) *, *(?P<Coord2>[(+|\-| ](([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("proyecto/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>-sphone (?P<telefono>\S*) (?P<fichero>\S*))|(?P<stime>-stime (?P<inicio>\S*) (?P<final>\S*) (?P<fichero>\S*))|(?P<n>n (?P<fichero>\S*))|(?P<snif>-snif (?P<nif>\S*) (?P<fichero>\S*))'
A = re.compile(argumentos)
match = A.match(arg_prueba)
print(type(match))
if __name__ == "__main__":
main()