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



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

我当前的尝试失败。。。

re.compile(r'^[A-Zd]$')

我们可以使用模式'd.*[A-Z]|[A-Z].*d'来搜索至少有一个大写字母和一个数字的条目。从逻辑上讲,大写字母和数字在字符串中的出现方式只有两种。字母在前,数字在后,或者数字在前,字母在后。

管道|表示"OR",因此我们将分别查看每一侧。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

另一个选项是使用前瞻。

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

参见regex101 上的演示

^开始处的预视检查[A-Z]是否在前方。如果是,则匹配一个数字。

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

.*[0-9].*

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

正则表达式没有AND运算符,因此当有效性由AND其他AND其他定义时,很难编写与有效密码匹配的正则表达式。

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

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

因此:

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

如果有与之匹配的内容,则该密码无效。

我认为这对你有用:

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

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

^(?=[^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

最新更新