re模块下的常用方法
import re
print(re.findall("a","eva egon yuan")) #['a', 'a']
返回所有满足匹配条件的结果,放在列表里
print(re.search("a","eva egon yuan").group()) #a
1.函数会在字符串内查找模式匹配,直到找到第一个匹配然后返回一个包含匹配信息的对象,
2.两个参数,正则表达式和待匹配的字符串,返回的是第一个满足条件的项
该对象可以通过group()方法获取到具体的值,如果字符串没有匹配,
使用.group()会报错,所以应该在使用group防止之前做判断
print(re.match("a","aeva egon yuan").group()) #a
同search,不同的是match方法的正则自带^效果
ret = re.search("([a-z])(d)","ab2748cdef14g239")
print(ret.group()) #b2 #直接获取正则规则匹配的项,内容示意
print(ret.group(1)) #b #如果给group传参数,那么传递的参数能够代替在正则表达式中组的次序
print(ret.group(2)) #2 #从而获取到对应次序上的值
print(re.split("[ab]","abcd")) #['', '', 'cd']
先按”a“分割得到 " " 和 "bcd" ,再对“bcd”进行分割 " " ,"cd"
ret = re.sub('d', 'H', 'eva3egon4yuan4', 1)#将数字替换成'H',参数1表示只替换1个
print(ret) #evaHegon4yuan4
print(re.subn("d","H","eva3egon4yuan4")) #('evaHegon4yuan4', 3) 将数字替换成“H”,返回元组(替换的结果,替换了多少次)
print(re.compile("d{3}").search('abc123eeee').group()) #123
将正则表达式编译成一个正则表达对象,规则要匹配的是3个数字 正则表达式对象调用search,
参数为待匹配的字符串
res = re.finditer('d', 'ds3sy4784a') #<callable_iterator object at 0x000001A8D8D07860> print([i.group() for i in res])
#['3', '4', '7', '8', '4'] findier 返回一个存放匹配结果的迭代器
findall的优先级
print(re.findall("www.(baidu|oldboy).com","www.oldboy.com")) #['oldboy']
这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可,?:是取消权限
print(re.findall("www.(?:baidu|oldboy).com","www.oldboy.com")) #['www.oldboy.com']
print(re.findall("[a-z]d","ab2748cdef14g239")) #['b2', 'f1', 'g2']
print(re.findall("([a-z])d","ab2748cdef14g239")) #['b', 'f', 'g']
在findall 的正则表达式中有分组,仍然按照正则规则取匹配,只不过在显示的时候,只显示分组的内容
print(re.findall("(?:[a-z])d","ab2748cdef14g239")) #['b2', 'f1', 'g2']
findall中取消分组
split的优先级查询
print(re.split("d+","eva3egon4yuan")) #['eva', 'egon', 'yuan']
print(re.split("(d+)","eva3egon4yuan")) #['eva', '3', 'egon', '4', 'yuan']
在匹配部分加上()之后所切出的结果是不同的
没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项
这个在某些需要保留匹配部分的使用过程是非常重要的
练习题:
1.匹配标签(分组命名)
import re
ret = re.search("<(?P<tag_name>w+)>w+</(?P=tag_name)>","<h1>hello</h1>")
print(ret.group("tag_name")) #h1
print(ret.group()) #<h1>hello</h1>
还可以在分组中利用?P<name>的形式给分组起名字
获取的匹配结果可以直接用group("名字")拿到对应的值
ret = re.search(r"<(w+)>w+</1>","<h1>hello</h1>")
print(ret.group()) #<h1>hello</h1>
print(ret.group(1)) #h1
如果不给组起名字。也可以利用序号来找到对应的组,表示要找的内容和前面的组内容
一致,获取的匹配结果可以直接用group(序号)拿到对应的值
2.匹配整数(有一些干扰项需要排除)
import re
ret = re.findall(r"-?d+.d*|(-?d+)","1-2*(60+(-40.35/5)-(-4*3))")
ret.remove("")
print(ret) #['1', '-2', '60', '5', '-4', '3']
3.r取消这个字符串中转译作用
凡是出现且没有特殊意义的时候都可以在字符串的前面加上r字符
r"\n" r"
"
例子:(路径和正则表达式)
r"app
tp"
flags有很多可选值:
re.I(IGNORECASE)忽略大小写,括号内是完整的写法
re.M(MULTILINE)多行模式,改变^和$的行为
re.S(DOTALL)点可以匹配任意字符,包括换行符
re.L(LOCALE)做本地化识别的匹配,表示特殊字符集 w, W, , B, s, S 依赖于当前环境,不推荐使用
re.U(UNICODE) 使用w W s S d D使用取决于unicode定义的字符属性。在python3中默认使用该flag
re.X(VERBOSE)冗长模式,该模式下pattern字符串可以是多行的,忽略空白字符,并可以添加注释