重点例题(*****)
import re
print(re.findall("(?!^[a-zA-Z]+$)(?!^[0-9]+$)^[a-zA-Z0-9]","@d34a6b"))
name=input(">>: ").strip() # egon1 egon2 egon3 ... egon100... egonN
print(re.search("(egon)(N|100)",name).group(2))
name="egonaaaN123"
print(re.findall("egon(?=.*N|100)a",name))
egonaaaN123
egona
egon(?=.*N|100)a
重点剖析:
要点1
re.findall("(?!^[a-zA-Z]+$)(?!^[0-9]+$)^[a-zA-Z0-9]","@d34a6b"))
若前一步不成立(即并非纯字母/纯数字),才进行下一步,最后判断条件都符合了,再进行取值
要点2
^[0-9]$ # 指的是 整个待比较字符从头到尾必须都是 数字,才能满足规则
^ 开头位置
$ 结束位置
^...$ 其指定的是 待比较字符串从头到尾 的样式(整个待比较字符的开头 到 整个字符串的结尾)
要点3
"egon(?=.*N|100)a"
先判断规则 然后进行断言, 断言成功 继续进行判断规则
判断失败 直接结束
--------------------------------------------------------
断言 就是一个判断依据(取值 要靠规则来提取);真正拿结果的是 非断言的规则得到的
.group(欲取出分组的下标) 取组
按照索引取出若干分组,中的某个分组的内容
1、两种不同的断言方式
① ?! 中,其后的( ! 表表示取反 )
规则成立, 则断言失败
规则不成立,则断言成功
② ?= 中,其后的
规则成立,则断言成功
规则不成立,则断言失败
2、断言中的指针变化
断言的关键点:下标(指针)的变化
断言是0宽度:成功的情况下,匹配完了之后指针还要跳过来
断言的指针,会沿用上一次断言最后的指针的位置
必须是匹配成功,最后才会发生指针的偏移(即回到开始断言的位置)
所以断言成功,就相当于断言不存在(因为对原指针位置没有任何影响)
断言成功,指针回到(断言所判断内容的那一段字符串的开头)最前面(不一定是整个待比较字符串的最前面,要看断言开始的位置)
所以后续如果要从头进行取值的话,需要指定 开始 或 结束 的位置
3、断言成功与否之后进行的操作
① 断言成功,继续进行下一步(进行判断规则/取值)
指针会回到 断言位置的开头(开始进行断言的位置)
② 断言失败,直接结束