import repassword_checker = re.compile("^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*])[A-Za-z\d!@#$%^&*]{8,30}$" )mat = re.search(password_checker, password)Tendo a usare solo i pattern che già conosco, quindi incontrarne uno nuovo così mi blocca. Ho colto l’occasione per fare pratica e analizzarlo. ref: Blog, COGNEX, Mozilla
- ^: inizio della riga
- $: fine della riga
- |: and
- \t: tab
- \n: a capo
- .: qualsiasi carattere
- []: corrisponde a qualsiasi carattere all’interno delle parentesi, indipendentemente dall’ordine
- es. [a-ZA-Z]
- [^]: corrisponde a tutto tranne i caratteri all’interno delle parentesi
- es. [^a-Z]: cerca escludendo l’alfabeto minuscolo
- *: zero o più occorrenze del carattere precedente
- Ripete il carattere prima di ’*’.
- es. ‘bo*’ corrisponde a ‘b’ e anche a ‘booooo’.
- ?: zero o una occorrenza del carattere precedente
- x(?=y): chiamato lookahead. Corrisponde a x solo se seguito da y.
- \d: uguale a 0-9. Corrisponde alle cifre.
Applicazione
import repassword_checker = re.compile("^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*])[A-Za-z\d!@#$%^&*]{8,30}$" )mat = re.search(password_checker, password)La regex qui sopra cerca stringhe che soddisfano le seguenti condizioni:
- Lunghezza da 8 a 30 caratteri
- Almeno una lettera maiuscola e una minuscola
- Almeno una cifra
- Almeno un carattere speciale (!@#$%^&*)
Controllo delle condizioni
(?=.[a-z])(?=.[A-Z])(?=.\d)(?=.[!@#$%^&*]) controlla ogni condizione una per una. Se una delle 4 condizioni è falsa, tutti e 4 i gruppi risultano falsi.
Guardando i post di blog qui sotto, è essenzialmente un concatenamento di più condizioni come un’operazione AND.