def validoDNI(dni):
tabla = "TRWAGMYFPDXBNJZSQVHLCKE"
dig_ext = "XYZ"
reemp_dig_ext = {'X':'0', 'Y':'1', 'Z':'2'}
numeros = "1234567890"
dni = dni.upper()
if len(dni) == 9:
dig_control = dni[8]
dni = dni[:8]
if dni[0] in dig_ext:
dni = dni.replace(dni[0], reemp_dig_ext[dni[0]])
return len(dni) == len([n for n in dni if n in numeros]) \
and tabla[int(dni)%23] == dig_control
return False
Eso comprueba que:
- Tenga una longitud de 9 dígitos, todos numéricos menos el primero (extranjeros) y el último (control) que pueden estar entre unas letras concretas.
- Si es extranjero se sustituye la primera letra por su número correspondiente antes de calcular el dígito de control.
- Se comprueba el dígito de control (última cifra).
Devuelve True o False.
Más información sobre el cálculo del dígito de control del NIF/NIE (Ministerio del Inerior, interior.gob.es).
para dnis
def checkDNI(dni):
return [‘T’,’R’,’W’,’A’,’G’,’M’,’Y’,’F’,’P’,’D’,’X’,’B’,’N’,’J’,’Z’,’S’,’Q’,’V’,’H’,’L’,’C’,’K’,’E’][int(dni[:-1])% 23] == dni[-1:]
print(checkDNI(‘12345678A’)); #false
print(checkDNI(‘12345678Z’)); #true