Pude escribir una expresión regular para validar los siguientes criterios para un cuadro de entrada.
Regex -> ^(?=.*[0-9])(?=.*[az])(?=.*[AZ])(?=.*[+=!@#$%^&*])(?=\\S+$).{14,}$
Sin embargo, esta expresión regular permite otros caracteres especiales que no se mencionan. Quiero restringir todos los caracteres especiales excepto estos +=!@#$%^&*
¿Podría alguien ayudarme a modificar la expresión regular dada con los criterios anteriores?
en lugar . que permite cualquier carácter, puede usar un conjunto de caracteres para restringir los caracteres permitidos a un conjunto específico:
^(?=.*[0-9])(?=.*[az])(?=.*[AZ])(?=.*[+=!@#$%^&*])(?=\\S+$)[0-9A-Za-z+=!@#$%^&*]{14,}$¿Por qué no usar conjuntos en lugar de una expresión regular?
import string upperSet = set(string.ascii_uppercase) lowerSet = set(string.ascii_lowercase) numberSet = set("0123456789") specialSet = set("+=!@#$%^&*") allSets = [upperSet,lowerSet,numberSet,specialSet] validSet = set().union(*allSets) isValid = len(pw)>=14 and validSet.issuperset(pw) \ and all(s.intersection(pw) for s in allSets)También puede usar el método de traducción para convertir cada grupo de caracteres en cuatro códigos que luego verifica que estén exactamente presentes en la cadena traducida:
validCheck = str.maketrans(string.ascii_letters + "0123456789" + "+=!@#$%^&*", "1"*26+"2"*26+"3"*10+"4"*10) isValid = len(pw)>=14 and set('1234') == set(pw.translate(validCheck))))