我正在使用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