Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 密码可以';t包含带re模块的三个或更多字符的序列_Python_Re - Fatal编程技术网

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”…]}
    ,可以轻松地实现自动化
  • 修改一个测试不会改变其他测试的通过/失败状态
  • 允许详细说明用户违反的规则
  • 为了提高效率,可以将设置更改为提前失败(只报告第一个错误)。在这种情况下,更快或经常失败的测试将首先进行

你说“三个或三个以上字符的序列”,但也可以说“我的”例如,该示例只涉及两个字符的序列。这是矛盾的,还是这里有两个独立的概念?我希望这是一个赋值,这样的密码约束会显著限制密码空间的减少security@steve3个或更多字符的序列两次或更多,可能我不能给出一个好的例子对不起。
'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)]))),