Python 密码可以';t包含带re模块的三个或更多字符的序列
我正在创建一个正则表达式,它应该匹配Python 密码可以';t包含带re模块的三个或更多字符的序列,python,re,Python,Re,我正在创建一个正则表达式,它应该匹配 8或10个字符长 第一个字符应该是唯一的字母 1位数字,1个特殊字符,无空格 字符序列不能是两次,如MyMy 我几乎可以捕捉到所有的东西,但我有些困惑。当我将(?={8,10})放在末尾时,它不起作用。只有当我在开头提到字符长度时,它才起作用。为什么?但同时我只想以字母开头密码,所以我使用了^那么开头的字符长度是否会影响^(?=[a-zA-Z])这个组?如何获取/捕获三个或更多字符的序列两次/多次,并在密码中忽略它 r"(?={8,10})^(
- 8或10个字符长
- 第一个字符应该是唯一的字母
- 1位数字,1个特殊字符,无空格
- 字符序列不能是两次,如MyMy
(?={8,10})
放在末尾时,它不起作用。只有当我在开头提到字符长度时,它才起作用。为什么?但同时我只想以字母开头密码,所以我使用了^
那么开头的字符长度是否会影响^(?=[a-zA-Z])
这个组?如何获取/捕获三个或更多字符的序列两次/多次,并在密码中忽略它
r"(?={8,10})^(?=[a-zA-Z])(?=.*\d)(\S+).*$"
我强烈建议不要使用单个正则表达式,而是(比如)使用一系列可以随意添加、启用或禁用的检查函数
考虑到密码检查是一个用户驱动的操作,所以无论您使用什么检查,它都会持续更长的毫秒;在这个阶段过早的优化在很大程度上是毫无意义的(除非你正在设计一个密码破解程序,但是架构是完全不同的)
比如:
import re
rules = {
'be between 8 and 10 chars' : (lambda pw: 8 <= len(pw) <= 10 ),
'start with a letter' : (lambda pw: re.match(r"^[A-Z]", pw)),
'contain a number' : (lambda pw: re.match(r"\\d", pw)),
'contain EXACTLY ONE number': (lambda pw: re.match(r"^\\D*\\d\\D*$", pw)),
...
}
fails = [ rule for rule, check in rules.items() if not check(pw) ]
对于“不包含大小为X或更多的重复序列”,您可以添加一个额外的函数:
'cannot contain the same 3-letter sequence twice'
: (lambda pw: len( [pw[i:i+3] for i in range(len(pw)-2)] )
== len(set([pw[i:i+3] for i in range(len(pw)-2)]))),
'cannot contain the same 2-letter sequence twice'
: (lambda pw: len( [pw[i:i+2] for i in range(len(pw)-1)] )
== len(set([pw[i:i+2] for i in range(len(pw)-1)]))),
请注意,严格地说,“香蕉”包含两次序列“an”(和“na”),以及两次“ana”序列:香蕉和香蕉
尽管效率较低,但我认为这种方法有几个优点:
- 它易于模块化
- 可以在不重新计算复杂正则表达式的情况下进行配置
- 测试用例可以使用与规则相同的语法(每个规则可以有一个dict,其中包含
,可以轻松地实现自动化{“mustpass”:[“pw1”、“pw2”、…]、“mustfail”:[“pw5”、“pw6”…]}
- 修改一个测试不会改变其他测试的通过/失败状态
- 允许详细说明用户违反的规则
- 为了提高效率,可以将设置更改为提前失败(只报告第一个错误)。在这种情况下,更快或经常失败的测试将首先进行
'cannot contain the same 3-letter sequence twice'
: (lambda pw: len( [pw[i:i+3] for i in range(len(pw)-2)] )
== len(set([pw[i:i+3] for i in range(len(pw)-2)]))),
'cannot contain the same 2-letter sequence twice'
: (lambda pw: len( [pw[i:i+2] for i in range(len(pw)-1)] )
== len(set([pw[i:i+2] for i in range(len(pw)-1)]))),