正则表达式用于处理字符串,检索和替换字符串,正则表达式在python爬虫中被广泛使用!特点灵活性、逻辑性和功能性都很强可以用非常简单的方式快速实现对字符串的复杂控制正则语法`#1,数字和字母都代表自己,.表示匹配除换行符以外的任意字符,.表示匹配。#2.前面加很多字母会有特殊意义-n:换行符-t:制表符-d:匹配数字,相当于[0-9]-D:非数字,相当于[^0-9]-w:代表数字、字母和下划线,中文,相当于[0-9a-zA-Z_]-W:代表w的反转-s:代表任何非打印字符(空格,换行,制表符)-S:表示anon-blankcharacter#3.大多数标点符号都有特殊含义-():用来表示一组,如果需要表示括号,需要使用-[]:匹配范围,[0-9]表示0个~9个范围,[0-9a-zA-Z]-|:表示或表示re.search(r'f(x|y|z)m','pdsfxm')匹配fxm-{},{2,},{,3},{1,3}:用于限制前一个元素出现的次数re.search(r'go{2}d','good')-*:表示前一个元素出现的次数element出现次数为0次或以上,相当于{0,}-+:表示前一个元素出现1次或以上,相当于{1,}-^:以指定内容开头,或negated含义-$:以指定内容结束#4.?的两种用法-规定前一个元素的出现次数最多只能出现一次,相当于{,1}-将贪心模式转换为非贪心模式(重点)`*1*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18*19*20*21*22re模块介绍XM返佣https://www.fx61.com/brokerli...这个模块是python默认的,专门用来处理正则的。它提供了相关的方法。match和search的常用方法只查询一次。Finditer找到所有匹配的数据并将它们放入一个可迭代对象中在findall中,将所有找到的字符串结果放入一个列表中。fullmatch是完全匹配,字符串需要满足正则表达式。使用Match类调用re.match、re.search或re.finditer遍历返回的对象。re.Match对象的属性和方法匹配类pos,endpos搜索字符串的起始位置和结束位置span()匹配的下标位置(元组)分组的概念`importrem=re.search(r'c.*z','abcdefgz')print(m.pos)#0print(m.endpos)#8print(m.span())#(2,8)#使用group得到匹配的字符串print(m.group())#cdefgz#group表示正则表达式的分组#1.正则表达式中用()表示一个分组#2.如果没有分组,默认只有一组#3.下标分组从0开始#这里有4组m1=re.search(r'(1.*)(2.*)(3.*4)','a1bcd2efgh3ij4k')print(m1.group())#默认是第0组1bcd2efgh3ij4print(m1.group(0))#0组是把整个正则表达式当成一个整体1bcd2efgh3ij4print(m1.group(1))#1bcdprint(m1.group(2))#2efghprint(m1.group(3))#3ij4#groups()将组作为元组返回print(m1.groups())#('1bcd','2efgh','3ij4')#(?Pexpression)给组取个名字m2=re.search(r'(?P1.*)(?P2.*)(?P3.*4)','a1bcd2efgh3ij4k')print(m2.groupdict())#{'一':'1bcd','二':'2efgh','三':'3ij4'}`*1*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18*19*20*21*22*23*24*25*26*27*28compile在re模块中,可以使用re.调用函数的方法,也可以调用re.compile得到一个对象`importre#这两种写法没有区别m=re.search(r'm.*a','111m22222a')print(m)#m2=re.compile(r'm.*a')result=m2.search('111m22222a')print(result)#`*1*2*3*4*5*6*7*8*9*10正则修饰符正则修饰符是修饰表达式re.I使匹配不区分大小写的re.M多行匹配,影响^和$re.Smakes。匹配所有字符,包括换行符`importre#。表示除换行符以外的任何字符x=re.search(r'm.*a','abcdmonxxxa')print(x)#None#re.S匹配换行符y=re.search(r'm.*a','abcdmonxxxa',re.S)#让.匹配换行符print(y)a=re.search(r'x','helloXyz')print(a)#None#re.Iignorecaseb=re.search(r'x','helloXyz',re.I)print(b)##re.M让$匹配换行符m=re.findall(r'w+$','iamboynyouaregirlheisman')print(m)#['man']n=re.findall(r'w+$','我是男孩你是女孩他是男人',re.M)print(n)#['男孩','女孩','男人']`*1*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18*19*20*21*22*23regularreplacementsub`importre#将数字替换为xm=re.sub(r'd','x','hello123wor123ld')print(m)#helloxxxworxxxldn=re.sub(r'd+','x','hello123wor123ld')print(n)#helloxworxld#要求:放入p内容的个数乘以2p='hello50good34'deftest(x):y=int(x.group(0))y*=2returnstr(y)#这里只能以字符串形式返回print(re.sub(r'd+',test,p))#hello100good68`*1*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18*19贪心模式和非贪心模式在正则表达式中,默认使用贪心模式,在贪心模式之后加入尽可能多的字符串?,可以将贪心模式转换为非贪心模式因为这里默认使用贪心模式n=re.search(r'm.*?a','abcm123a456a')print(n)#m123auses?将贪婪模式转换为非贪婪模式#?print(re.match(r'aa(d+)','aa123bb456').group(1))#123print(re.match(r'aa(d+?)','Aa123bb456').group(1))#1print(re.match(r'aa(d+?)','aa123bb456').group(0))#aa1#虽然说是尽量少匹配,但是也满足匹配print(re.match(r'aaa(d+)ddd','aaa2333ddd').group(0))#aaa2333dddprint(re.match(r'aaa(d+?)ddd','aaa2333ddd').group(1))#2333print(re.match(r'aaa(d+).*','aaa2333ddd').group(0))#aaa2333dddprint(re.match(r'aaa(d+).*','aaa2333ddd').group(1))#2