我正在使用Python和Flask对密码进行表单验证。密码至少需要包含一个大写字母和至少一个数字。
我目前失败的尝试......
re.compile(r'^[A-Z\d]$')
答案 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)
答案 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