第6课-正则表达式
1、元字符介绍
"^" :^会匹配行或者字符串的起始位置,有时还会匹配整个文档的起始位置。
"$" :$会匹配行或字符串的结尾
"\b" :不会消耗任何字符只匹配一个位置,常用于匹配单词边界 如 我想从字符串中"This is Regex"匹配单独的单词 "is" 正则就要写成 "\bis\b"
"\d": 匹配数字
"\w":匹配字母,数字,下划线
"\s":匹配空格
".":匹配除了换行符以外的任何字符
"[abc]": 字符组 匹配包含括号内元素的字符
2、反义(写法很简单改成大写就行了,意思与原来的相反)
"\W" 匹配任意不是字母,数字,下划线 的字符
"\S" 匹配任意不是空白符的字符
"\D" 匹配任意非数字的字符
"\B" 匹配不是单词开头或结束的位置
"[^abc]" 匹配除了abc以外的任意字符
3、量词
先解释关于量词所涉及到的重要的三个概念
贪婪(贪心) 如"*"字符 贪婪量词会首先匹配整个字符串,尝试匹配时,它会选定尽可能多的内容,如果 失败则回退一个字符,然后再次尝试回退的过程就叫做回溯,它会每次回退一个字符,直到找到匹配的内容或者没有字符可以回退。相比下面两种贪婪量词对资源的消耗是最大的,
懒惰(勉强) 如 "?" 懒惰量词使用另一种方式匹配,它从目标的起始位置开始尝试匹配,每次检查一个字符,并寻找它要匹配的内容,如此循环直到字符结尾处。
占有 如"+" 占有量词会覆盖事个目标字符串,然后尝试寻找匹配内容 ,但它只尝试一次,不会回溯,就好比先抓一把石头,然后从石头中挑出黄金
"*"(贪婪) 重复零次或更多( 例如"aaaaaaaa" 匹配字符串中所有的a 正则: "a*" 会出到所有的字符"a")
"+"(懒惰) 重复一次或更多次(例如"aaaaaaaa" 匹配字符串中所有的a 正则: "a+" 会取到字符中所有的a字符, "a+"与"a*"不同在于"+"至少是一次而"*" 可以是0次)
"?"(占有) 重复零次或一次(例如"aaaaaaaa" 匹配字符串中的a 正则 : "a?" 只会匹配一次,也就是结果只是单个字符a)
"{n}" 重复n次(例如从"aaaaaaaa" 匹配字符串的a 并重复3次 正则: "a{3}" 结果就是取到3个a字符 "aaa")
"{n,m}" 重复n到m次(例如正则 "a{3,4}" 将a重复匹配3次或者4次 所以供匹配的字符可以是三个"aaa"也可以是四个"aaaa" 正则都可以匹配到)
"{n,}" 重复n次或更多次
4、懒惰限定符
"*?" 重复任意次,但尽可能少重复
"+?" 重复1次或更多次,但尽可能少重复
"??" 重复0次或1次,但尽可能少重复
"{n,m}?" 重复n到m次,但尽可能少重复
"{n,}?" 重复n次以上,但尽可能少重复
5、分组
()正则中捕获分组其实就是一个括号内的内容
|:匹配多个字符串或表达式
转义字符(\)和原始字符串(r)
6、练习
import re s="""693152032@qq.com, werksdf@163.com, sdf@sina.com sfjsdf@139.com, soifsdfj@134.com pwoeir423@123.com""" res = re.findall(r"\w+@\w+.com",s) content = re.sub(r"\w+@\w+.com","285469451@qq.com",s) print(content) s="""i love you not because of who 234 you are, 234 but 3234ser because of who i am when i am with you""" result = re.findall(r"\b[a-zA-Z]+\b",s) content = re.sub(r"\b\d+\w*\b",r"\b",s) print(content) s = "-100.01" res = re.match(r"-?(\d|[1-9]\d+)\.\d+",s) print(res) # 将变量转换为鸵方的形式 s = "get-element-by-id" def convet(value): return str(value.group()).upper() content = re.sub("-\w",convet,s) print(content) s = "10101111" res = re.search("[01]+",s) print(res.group()) s = "我的办公电话是:000-12344562,有问题请及时与我联系,谢谢!" res = re.findall("\d{3}-\d{8}",s) print(res) s = "目前可以分配到的IP地址为:255.221.221.12" res = re.findall("\d{3}\.\d{1,3}\.\d{1,3}\.\d{1,3}",s) print(res) s = "<a herf='www.baidu.com'>" res = re.search("<a\s(.+)>",s) print(res.group(1)) s = "12345678901" content = re.sub("\d{3}",lambda value:"{}.".format(value.group()),s) print(content)