import re
1.常用方法:
findall ⭐⭐⭐⭐⭐
import re ret = re.findall("d+","s1da48e5d1fw8e4f") #第一个参数为正则,第二个参数为待匹配字符串 print(ret) #返回值:列表格式返回一个值,内容为所有匹配上的项
search ⭐⭐⭐⭐⭐
import re ret = re.search("d+","s1da48e5d1fw8e4f") #返回值类型为正则匹配结果的对象,返回一个值, print(ret) #匹配上就返回对象
print(ret.group()) #返回的对象通过group()来获取匹配到的第一个结果
match ⭐⭐
import re ret = re.match('d+','19874ashfk01248') print(ret)
#结果 <_sre.SRE_Match object; span=(0, 5), match='19874'>
#match方法在正则匹配之前一藏了一个^("^d+"),所以总是默认从第一位开始匹配,第一位匹配不上就是None ret1 = re.match('d+','%^19874ashfk01248') print(ret1)
#结果 None
替换(相当于replace)
sub ⭐⭐⭐
import re print("a1s2ad3fa3g".replace("a","A",3)) ret =re.sub("d+","A","a1s2ad3fa3g") #把数字都替换成大写的 A print(ret) #结果 A1s2Ad3fA3g ret1 =re.sub("d+","A","a12s23ad43fa35g",1) #最后一个参数表示替换几次,1就是只替换第一个 print(ret1) # 结果 aAs23ad34fa35g
subn ⭐⭐⭐
import re ret = re.subn('d+','H','replace789nbc2xcz392zx') print(ret) #返回值为元组,第一个为匹配后结果,第二个参数为替换的次数 #结果 #('replaceHnbcHxczHzx', 3)
split ⭐⭐⭐
import re ret = re.split("d+","a10b20c30d40") print(ret) #结果 ['a', 'b', 'c', 'd', '']
2.进阶方法 - 爬虫自动化开发
compile ⭐⭐⭐⭐⭐ (时间效率)
import re ret = re.compile("-0.d+|-[1-9]d+(.d+)?") #利用compile方法提前准备好一个匹配规则 obj = ret.search("alex83egon-20taibai-40") #需要的时候直接调用,ret.方法,里面参数传待匹配字符串 print(obj.group())
此方法节省时间,只有在多次使用某一个相同规则表达式的时候,compile才会帮助我们提高效率
finditer ⭐⭐⭐⭐⭐ (空间效率)
import re ret = re.finditer("d+","df154dsfwe8f4d5x21wfe4") print(ret) #结果 <callable_iterator object at 0x000001CAFFB4C080> #拿到一个迭代器 for i in ret : print(i.group()) #循环拿出每一个元素
findall是一次把所有匹配的元素全部拿出来,如果是很大的文件会很占内存,这是利用finditer,需要一个拿一个,节省内存空间
匹配的优先级 ⭐⭐⭐⭐⭐
1. findall()优先级
import re ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com') print(ret) # ['oldboy'] 这是因为findall会优先把匹配结果组里内容返回,如果想要匹配结果,取消权限即可 ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com') print(ret) # ['www.oldboy.com']
2.split()优先级
ret=re.split("d+","eva3egon4yuan") print(ret) #结果 : ['eva', 'egon', 'yuan'] ret=re.split("(d+)","eva3egon4yuan") print(ret) #结果 : ['eva', '3', 'egon', '4', 'yuan'] #在匹配部分加上()之后所切出的结果是不同的, #没有()的没有保留所匹配的项,但是有()的却能够保留了匹配的项, #这个在某些需要保留匹配部分的使用过程是非常重要的。
3.search()
import re ret = re.search('d+(.d+)(.d+)(.d+)?','1.2.3.4-2*(60+(-40.35/5)-(-4*3))') print(ret.group()) print(ret.group(1)) print(ret.group(2)) print(ret.group(3))
分组命名
(?P<name>)==>(?P=name)
<w+>w+</1>
import re ret = re.search("<(?P<tag_name>w+)>w+</(?P=tag_name)>","<h1>hello</h1>") #还可以在分组中利用?<name>的形式给分组起名字 #获取的匹配结果可以直接用group('名字')拿到对应的值 print(ret.group('tag_name')) #结果 :h1 print(ret.group()) #结果 :<h1>hello</h1> ret = re.search(r"<(w+)>w+</1>","<h1>hello</h1>") #如果不给组起名字,也可以用序号来找到对应的组,表示要找的内容和前面的组内容一致 #获取的匹配结果可以直接用group(序号)拿到对应的值 print(ret.group(1)) print(ret.group()) #结果 :<h1>hello</h1>