作者:python来源:SegmentFault 思否社区正则表达式用来处理字符串,对字符串进行检索和替换,另外正则在python爬虫的应用也是相当广泛!特点灵活性、逻辑性和功能性非常强可以迅速地用极简单的方式达到字符串的复杂控制
正则语法
#2、很多字母前面添加会有特殊含义 -n:换行 - t:制表符 -d:匹配数字,等价[0-9] -D:非数字,等价于[^0-9] -w:表示数字、字母以及下划线,中文,等价于[0-9a-zA-Z_] - W:表示w取反 -s:表示任意的非打印字符(空格、换行、制表符) -S:表示非空白字符 #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') -*:表示前面的元素出现的次数为0次及以上,等价于{0,} -+:表示前面的元素出现的次数为1次及以上,等价于{1,} -^:以指定的内容开头,或者取反的意思 -$:以指定的内容结尾 #4、?的两种用法 -规定前面元素出现的次数最多只能出现1次,等价于{,1} -将贪婪模式转换为非贪婪模式(重点)``#1、数字和字母都表示它本身,.表示匹配除了换行以外的任意字符,.表示匹配.
re模块的介绍
XM返佣 /brokerlist/xm.html该模块是python中专门用于处理正则的默认,提供了相关的方法常用方法
match、search 只查询一次
finditer 查找到所有的匹配数据放到一个可迭代对象中
findall 把查找到的所有字符串结果放到一个列表中
fullmatch 完全匹配,字符串需要满足正则表达式
Match类的使用
调用re.match,re.search或者对re.finditer的遍历返回的对象都是re.Match对象Match类的属性和方法
pos、endpos 被查找字符串的起始和终端位置span( ) 匹配到的下标位置(元组)group 分组的概念m=re.search(r'c.*z','abcdefgz') print(m.pos)#0 print(m.endpos)#8 print(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组1bcd2efgh3ij4 print(m1.group(0))#第0组就是把整个正则表达式当做一个整体1bcd2efgh3ij4 print(m1.group(1))#1bcd print(m1.group(2))#2efgh print(m1.group(3))#3ij4 #groups()将分组以元组的形式返回 print(m1.groups())#('1bcd','2efgh','3ij4') #(?P表达式)给分组取个名字 m2=re.search(r'(?P1.*)(?P2.*)(?P3.*4)','a1bcd2efgh3ij4k') print(m2.groupdict())#{'one':'1bcd','two':'2efgh','three':'3ij4'}``importre
compile在re模块,可以使用re.方法调用函数,还可以调用pile得到一个对象
#这两种写法没有区别 m=re.search(r'm.*a','111m22222a') print(m)# m2=pile(r'm.*a') result=m2.search('111m22222a') print(result)#``importre
正则修饰符
正则修饰符是对表达式进行修饰re.I 使匹配对大小写不敏感re.M 多行匹配,影响 ^ 和$re.S 使 . 匹配包括换行在内的所有字符#.表示除了换行以外的任意字符 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.I忽略大小写 b=re.search(r'x','helloXyz',re.I) print(b)# #re.M让$匹配到换行 m=re.findall(r'w+$','iamboynyouaregirlnheisman') print(m)#['man'] n=re.findall(r'w+$','iamboynyouaregirlnheisman',re.M) print(n)#['boy','girl','man']``importre
正则替换
sub#把数字替换成x m=re.sub(r'd','x','hello123wor123ld') print(m)#helloxxxworxxxld n=re.sub(r'd+','x','hello123wor123ld') print(n)#helloxworxld #需求:将p中内容的数字乘2 p='hello50good34' deftest(x): y=int(x.group(0)) y*=2 returnstr(y)#这里只能以字符串的形式返回 print(re.sub(r'd+',test,p))#hello100good68``importre
贪婪模式与非贪婪模式
在正则表达式里,默认采用的是贪婪模式,尽可能匹配多的字符串 在贪婪模式后面添加?,可将贪婪模式转化为非贪婪模式m=re.search(r'm.*a','abcm123a456a') print(m)# m123a456a,这里为什么不是m123a呢?因为这里默认使用的贪婪模式 n=re.search(r'm.*?a','abcm123a456a') print(n)#m123a使用?将贪婪模式转化为非贪婪模式 #? print(re.match(r'aa(d+)','aa123bb456').group(1))#123 print(re.match(r'aa(d+?)','aa123bb456').group(1))#1 print(re.match(r'aa(d+?)','aa123bb456').group(0))#aa1 #虽然说是尽可能少的匹配,但也要满足匹配呀 print(re.match(r'aaa(d+)ddd','aaa2333ddd').group(0))#aaa2333ddd print(re.match(r'aaa(d+?)ddd','aaa2333ddd').group(1))#2333 print(re.match(r'aaa(d+).*','aaa2333ddd').group(0))#aaa2333ddd print(re.match(r'aaa(d+?).*','aaa2333ddd').group(1))#2importre
-END -