2015-11-07 16 views
5

Sto facendo la convalida del modulo per una password usando Python e Flask. La password deve contenere almeno una lettera maiuscola e almeno un numero.Python Regex: la password deve contenere almeno una lettera maiuscola e il numero

Il mio attuale tentativo fallito ...

re.compile(r'^[A-Z\d]$') 
+1

''\ d. * [A-Z] | [A-Z]. * \ D' –

+0

@PierreLafortune Ti dispiacerebbe spiegare la tua espressione regolare? Funziona penso ... –

+0

@PierreLafortune In realtà, non funziona. –

risposta

9

Possiamo usare il modello '\d.*[A-Z]|[A-Z].*\d' per cercare le voci che hanno almeno una lettera maiuscola e un numero. Logicamente parlando ci sono solo due modi in cui una lettera maiuscola e un numero possono apparire in una stringa. O viene prima la lettera e il numero dopo o il numero prima e la lettera dopo.

Il tubo | indica "OR", quindi esamineremo ciascun lato separatamente. \d.*[A-Z] corrisponde a un numero seguito da una lettera maiuscola, [A-Z].*\d corrisponde a qualsiasi lettera maiuscola seguita da un numero.

words = ['Password1', 'password2', 'passwordthree', 'P4', 'mypassworD1!!!', '898*(*^$^@%&#abcdef'] 
for x in words: 
    print re.search('\d.*[A-Z]|[A-Z].*\d', x) 
#<_sre.SRE_Match object at 0x00000000088146B0> 
#None 
#None 
#<_sre.SRE_Match object at 0x00000000088146B0> 
#<_sre.SRE_Match object at 0x00000000088146B0> 
#None 
0

Le espressioni regolari non hanno un operatore, quindi è abbastanza difficile scrivere una regex che corrisponde password valide, quando la validità è definito da qualcosa e qualcos'altro e qualcos'altro.

Ma, le espressioni regolari non hanno un operatore o, quindi basta applicare il teorema di De Morgan, e scrivere un'espressione regolare che corrisponde password non valide:

nulla con nessun numero o qualsiasi cosa con nessun maiuscolo

Quindi:

^([^0-9]*|[^A-Z]*)$ 

Se qualcosa corrisponde, allora è una password non valida.

+1

l'asterisco corrisponderà a 0 o più caratteri ... quindi rimuovilo ... anche questo può essere fatto come [^ 0-9A-Z] – repzero

+0

@repzero, no è scorretto. Il mio regex corrisponde a "1" e "A".il tuo non è –

+0

Nota che è per * corrispondenza * una stringa, non * ricerca * in una stringa, se questo fa la differenza per qualunque cosa stavi pensando –

3

Un'altra opzione è utilizzare uno lookahead.

^(?=.*?[A-Z]).*\d 

Vedi demo at regex101

Il lookahead a ^ controlli di inizio se un [A-Z] è avanti. Se così corrisponde a una cifra.

0

da abbinare con stringa che contiene almeno un carattere carattere usare:

.*[0-9].* 

La regex simile vale per controllare/minuscole superiore.

Problemi correlati