江湖散人 发表于 2021-6-30 17:48:27

如何让顺序变成无序?

import re

password = re.compile(r'(\d+)(+)(+)(.+){5,}')
mo = password.search('8Gm12345')
print(mo.group())


这是一个验证密码强度的程序,密码必须包含:至少一个数字,至少一个大写和一个小写字母,长度必须大于8.
我写的这个正则表达式只能是按照“数字,大写,小写,还有五个以上的任意字符”。

问题:如何让这个顺序的匹配变为无序的呢?也就是说不用先数字,然后大写。。。,只要有数字和大写小写字母就行。

wp231957 发表于 2021-6-30 18:13:17

正则不是万能的

灰晨 发表于 2021-6-30 18:32:14

本帖最后由 灰晨 于 2021-6-30 18:35 编辑

r'(?=.*?)(?=.*?)(?=.*?).{8,}'

hrpzcf 发表于 2021-6-30 18:45:08

import re

password = re.compile(r'{8,}')
mo = password.search('8Gm12345')
if mo:
    print(mo.group())
else:
    print("密码不符合要求。")

灰晨 发表于 2021-6-30 18:51:34

hrpzcf 发表于 2021-6-30 18:45


你这样还是有问题的,这样密码里就只能是数字和大小写了,有特殊字符(#¥%)之类的就不符合了
而且没有满足至少有一个,我密码全是数字也能过的

江湖散人 发表于 2021-6-30 19:07:04

hrpzcf 发表于 2021-6-30 18:45


谢谢

江湖散人 发表于 2021-6-30 19:10:01

灰晨 发表于 2021-6-30 18:32
r'(?=.*?)(?=.*?)(?=.*?).{8,}'

你这里的=是啥意思啊?

江湖散人 发表于 2021-6-30 19:14:16

灰晨 发表于 2021-6-30 18:32
r'(?=.*?)(?=.*?)(?=.*?).{8,}'

能麻烦你讲解一下整个正则表达式的意思吗?有点看不懂

hrpzcf 发表于 2021-6-30 19:42:05

灰晨 发表于 2021-6-30 18:51
你这样还是有问题的,这样密码里就只能是数字和大小写了,有特殊字符(#¥%)之类的就不符合了
而且没有 ...

哦,没注意看,还以为只要大小写和数字

灰晨 发表于 2021-7-1 11:02:34

本帖最后由 灰晨 于 2021-7-1 11:17 编辑

(?=a) 表示我们需要匹配某样东西的前面。    (?=a)非获取匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。------官方
(?!a) 表示我们需要不匹配某样东西。
(?:a) 表示我们需要匹配某样东西本身。
(?<=a) 表示我们需要匹配某样东西的后面。
(?<!a) 表示我们需要不匹配某样东西,与(?!a)方向相反。
a=.*?
.表示除\n之外的任意字符
*表示匹配0-无穷
后边多一个?表示懒惰模式。
必须跟在*或者+后边用
匹配到第一个就结束了一次匹配。不会继续向后匹配。因为他懒惰嘛。
(?=.*?)
匹配【A-Z】前面的字符,说明至少要有一个【A-Z】,不然匹配失败
该匹配不需要获取供以后使用。
即匹配a前面的字符,多少个无所谓,0个也行,但要要a,也就是【A-Z】,而且只是匹配但不获取
(?=.*?)(?=.*?)(?=.*?)
即匹配前面的字符,说明有
.{8,}
匹配 . 8次
.表示除\n之外的任意字符
页: [1]
查看完整版本: 如何让顺序变成无序?