2015-11-07 1412 views
5

我正在使用Python和Flask進行密碼的表單驗證。密碼至少需要包含一個大寫字母和至少一個數字Python正則表達式:密碼必須包含至少一個大寫字母和數字

我現在失敗的嘗試......

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

''\ d。* [A-Z] | [A-Z]。* \'d' –

+0

@PierreLafortune您介意解釋您的正則表達式嗎?它的作品,我認爲... –

+0

@PierreLafortune其實,它不工作。 –

回答

9

我們可以使用模式'\d.*[A-Z]|[A-Z].*\d'來搜索至少有一個大寫字母和一個數字條目。從邏輯上講,大寫字母和數字可以出現在字符串中的方式只有兩種。無論是信件首先和數字之後或數字第一和信件之後。

該管|表示'或',所以我們會分開看每一面。 \d.*[A-Z]與後跟大寫字母的數字匹配,[A-Z].*\d與任何後跟數字的大寫字母匹配。

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

正則表達式沒有AND運算符,所以它是相當困難的編寫符合有效密碼,當有效期由東西,別的東西別的東西定義的正則表達式。

但是,正則表達式確實有一個或運營商,因此只是採用德摩根定理,並編寫匹配無效密碼正則表達式:

任何東西,沒有數字或沒有大寫

所以任何東西:

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

如果有任何匹配,那麼它是一個無效的密碼。

+1

星號將匹配0或更多的字符...因此刪除它..也可以這樣做[^ 0-9A-Z] – repzero

+0

@repzero,這是不正確的。我的正則表達式匹配「1」和「A」。你的不是 –

+0

請注意,它是*匹配*字符串,而不是*搜索*在字符串中,如果這對你想象中的任何事物有所影響 –

3

另一種選擇是使用lookahead

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

demo at regex101

先行在^開始檢查如果有一個[A-Z]領先。如果這樣匹配一個數字。

0

要匹配與包含至少一個數字字符,使用字符串:

.*[0-9].* 

類似的正則表達式應用到檢查/小寫。

相關問題