作者art1 (人,原来不是人)
看板Python
标题Re: [问题] 请问密码检测的正规表达式
时间Fri Feb 1 18:20:36 2019
※ 引述《jijuan ()》之铭言:
: 看到一个题目是长度为8的密码,
: 必须至少含有一个大写字母、一个小写字母和一个数字,
: 找到这个正规表达式,
: ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8}$
我会这样解读
.*\d 代表一个数字前面可以为任意字元
或说任意字元之後一定要出现一个数字
.*[a-z] 代表一个小写字母前面可以为任意字元
或说任意字元之後一定要出现一个小写字母
.*[A-Z] 代表一个大写字母前面可以为任意字元
或说任意字元之後一定要出现一个大写字母
三个条件都用 ?= 包起来,代表这三者要同时成立才是想要的字串
?=.*\d 找到的是一个数字前方的位置,例如 abc4def
c与4之间的那个位置就符合此规则
其余同理
至於加 .* 的理由是 ?=\d 跟 ?=[a-z] 并用会导致不存在符合的情况
我不知道要怎麽解释比较正确,感觉上像是两者找到的位置是不可能同时存在的
而字串 abc4efg 使用 (?=.*\d)[a-z] 筛选,符合的是 a、b、c 三笔资料
字串 abc4efg 使用 (?=.*\d)a 筛选,符合的是 a
字串 abc4efg 使用 (?=.*\d)b 筛选,符合的是 b
字串 abc4efg 使用 (?=.*\d)c 筛选,符合的是 c
字串 abc4efg 使用 (?=.*\d)e 筛选,找不到符合的
字串 4efg 使用 (?=.*\d)e 筛选,找不到符合的
加上 .* 让原本的 \d 规则限制变宽了
: 有几个地方不懂想请问,
: (1)?=这部分是Positive lookahead,查了一下它的定义是:
: Positive lookahead works just the same. q(?=u) matches a q that is followed
: by a u, without making the u part of the match.
: 所以第一个括号里,是 .*\d 这一部分被视为u吗?这样的话q是指哪部分呢?
: 对第二个括号来说,它前面的(?=.*\d)被视为q吗?还是每个括号都是独立的分组?
: 还是说因为lookahead本身不会消耗字元,所以在没有 q的情况下,就把它当作是一个
: 判断句来用这样?
: (2).*用来匹配所有东西,那为什麽後面还跟着\d?我现在的理解是,假设"abFj45dE"
: 是我要比对的密码,比对到4这个数字时,abFj就是.*的部分吗?也就是说必须符合一
: 串字元之後必须0-9之间的数字这样?还是说(?=.*)本身就是一个特定的写法?
: (3)另外根据语言的不同,是不是有些正规表达式中lookbehind只允许等宽长度的字串
: ?
--
「看在上帝的份上,我们不能当着孩子的面枪杀他的父亲!」
「那我们就连孩子一起干掉!」
「第一枪打中的是那个天真的孩子,第二枪是抱着孩子的母亲。第三枪
停顿了三秒,当难以致信的父亲擦拭着脸上爱子的脑浆从震惊中醒转
过来,慢慢的转头看向停车的地方,分辨出是谁在攻击他後,第三颗
子弹才将他的脑壳打飞。」 ─摘自〈狼群〉
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.47.161.122
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1549016440.A.228.html
1F:→ s860134: 加上.*是因为 pattern 第一个字元是 ^ ,没有前导任意长 02/01 22:35
2F:→ s860134: 度万用字元,会变成强制要第一个字元符合三种 assertion 02/01 22:35
3F:→ s860134: 你的 pattern 将不会有任何匹配的可能 02/01 22:36
4F:→ art1: 我给的例子都没加上^ 02/02 04:02
5F:→ art1: regex101.com标示出来的结果显示 ?=.*\d 符合的是一个数字 02/02 04:05
6F:→ art1: 前面的任意位置 02/02 04:06
7F:→ art1: 而不是我说的只有 c 与 4 之间这个位置 02/02 04:07
8F:→ art1: ?=\d 符合的才是 abc4efg 的 c 与 4 之间的单一位置 02/02 04:08
9F:→ s860134: 你知道 search 和 match 的差别吗? 02/02 10:24
10F:→ art1: 有没有消耗字元的区别? 02/02 12:36