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