Python Regex:密码必须至少包含一个大写字母和数字

时间:2015-11-07 22:16:43

标签: python regex flask

我正在使用Python和Flask对密码进行表单验证。密码至少需要包含一个大写字母和至少一个数字

我目前失败的尝试......

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

6 个答案:

答案 0 :(得分:10)

我们可以使用模式'\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

答案 1 :(得分:3)

另一种选择是使用lookahead

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

请参阅demo at regex101

^处的前瞻检查是否提前[A-Z]。如果匹配一个数字。

答案 2 :(得分:1)

要匹配包含至少一位数字符的字符串,请使用:

.*[0-9].*

类似的正则表达式适用于检查大写/小写。

答案 3 :(得分:0)

正则表达式没有AND运算符,因此编写与有效密码匹配的正则表达式非常困难,当有效性由某些东西和其他东西定义时,其他东西也是如此。

但是,正则表达式确实有一个OR运算符,所以只需应用DeMorgan定理,并编写一个匹配无效密码的正则表达式:

任何没有数字的东西或任何没有大写的东西

所以:

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

如果有任何匹配,则表示密码无效。

答案 4 :(得分:0)

我认为它可以工作 ^(?=。 [A-Z])(?=。 \ d)。* $

答案 5 :(得分:0)

使用两个非贪婪的前瞻断言:

^(?=[^A-Z]*[A-Z])(?=[^0-9]*[0-9])

以上断言当前输入位置(字符串的开头)由 0 个或多个非大写字母后跟一个大写字母组成,并且它还由 0 个或多个非数字后跟一个数字组成。

import re

tests = [
    'x1bcAd',
    'xAbcd1d',
    'abcde',
    '1234',
    'AAAA'
]

for test in tests:
    m = re.match(r'^(?=[^A-Z]*[A-Z])(?=[^0-9]*[0-9])', test)
    print(test, 'Passed' if m else 'Failed')

打印:

x1bcAd Passed
xAbcd1d Passed
abcde Failed
1234 Failed
AAAA Failed