正则表达式(re模块)
Posted finance-it-gao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式(re模块)相关的知识,希望对你有一定的参考价值。
s=‘hello world‘ print(s.find(‘llo‘)) #找到llo ret=s.replace(‘ll‘,‘xx‘) #用xx代替ll print(ret) print(s.split(‘o‘)) #用o分割字符串
通过以上例子可以看出,字符串提供的方法是完全匹配
正则表达式可以用来匹配字符串,可以进行模糊匹配,增加了灵活度
import re ret=re.findall(‘ww{2}l‘,‘hello world‘) #找到w开头,l结尾,中间两个字符任意的字符串 print(ret) #findall找到所有满足条件的结果
一、元字符:(. ^ $ * + ? {} [] | () )
1.通配符:.
ret=re.findall(‘w..l‘,‘hello world‘) # .可以代表所有字符(除换行符外),一个点匹配一位 print(ret) #找到w开头,l结尾,中间两个字符任意的字符串
2.尖角符:^ 只从开头匹配
ret=re.findall(‘^h...o‘,‘jiibhelloko‘) print(ret)
3.dollor符:$ 只从结尾匹配
ret=re.findall(‘h...o$‘,‘jiibhelhioko‘) print(ret)
4.星号:* 重复前面的字符(0到多次),可以重复普通字符,也可以重复元字符
ret=re.findall(‘a*‘,‘jiibaaaaoko‘) #重复a 0到多次 print(ret) ret=re.findall(‘a.*li‘,‘kiidalexkuulicvyf‘) #重复点 0到多次 print(ret)
5.加号:+ 重复前面的字符(1到多次),与*类似
ret=re.findall(‘a+b‘,‘jabgagbhiaaaaboko‘) #重复a 1到多次 print(ret)
6.问号:? 重复前面的字符(0次或1次)
ret=re.findall(‘a?ko‘,‘jahkoaaaaokojiako‘) print(ret) #因为a重复0次或1次,所以此处代表找到ko或ako
7.大括号:{} 重复前面的字符(自定义次数)
ret=re.findall(‘a{4}hu‘,‘huaaaahuffg‘) #重复a 4次 print(ret) ret=re.findall(‘a{1,3}hu‘,‘ahudaaahufaahufg‘) #重复a 1到3次 print(ret)
8.字符集:[] 取消元字符的特殊功能( ^ - 除外)
ret=re.findall(‘a[chd]x‘,‘a,xadcadx‘) #匹配三个中任意一个字符,c、h、d都可以 print(ret) ret=re.findall(‘a[a-z]x‘,‘amxadcakx‘) #匹配a-z的任意一个字符 print(ret) ret=re.findall(‘w[,d*]l‘,‘w,,lewkljiw*lwdddl‘) #匹配逗号/星号/d,此处*不再是对d的重复 print(ret) ret=re.findall(‘w[^t,h]‘,‘wtwfwgwtwhwjfgtw,hu‘) #中括号里,上尖号代表取反 print(ret) #此处匹配除t和h以外的其他字符
9.反斜杠:
(I)反斜杠后边跟普通字符实现特殊功能:
(1) d 匹配0-9的十进制数,相当于[0-9]
print(re.findall(‘d{11}‘,‘fi159485526448521‘)) #找到一个电话号码
(2) D 匹配任何非数字字符,相当于[^0-9]
print(re.findall(‘D{4}‘,‘fi159JIHGB6448521‘))
(3) s 匹配任何空白字符
print(re.findall(‘sad‘,‘fiad94 ad1‘))
(4) S 匹配任何非空白字符
print(re.findall(‘Sad‘,‘fiad94 ad1‘))
(5) w 匹配任何字母/数字字符,相当于[a-zA-Z0-9]
print(re.findall(‘wad‘,‘fiad94 ad1K54ad‘))
(6) W 匹配任何非字母/数字字符,相当于[^a-zA-Z0-9]
print(re.findall(‘Wad‘,‘fiad94 ad1K5.ad‘))
(7) 匹配一个特殊字符
print(re.findall(r‘I‘,‘I a.Im a LIST‘)) #找出前面带特殊字符的I print(re.findall(r‘I‘,‘I am a LISTI.P‘)) #找出后面带特殊字符的I
(II)反斜杠后边跟特殊字符取消特殊功能:
ret = re.search(‘sb‘,‘hducbsbiudhsb‘) #search只找到一个满足条件的结果 print(ret) print(ret.group()) ret=re.search(‘a.‘,‘asda.dd‘).group() #反斜杠使通配符失去意义,此处就代表字符 . print(ret) ret=re.search(‘a+‘,‘aaasa+d‘).group() #反斜杠使加号失去特殊意义,此处就代表字符 + print(ret)
(III)有时前面加‘r‘的原因及如何匹配反斜杠
re是一门独立的编程语言,pythdon的两个\匹配re中的一个,re是用前面的两个\匹配后面的一个(后面的一个顶两)
所以前面不加‘r‘时,是从python开始解释,4个匹配后面的一个;加‘r‘时,是从re开始解释,两个即可匹配后面的一个
ret=re.findall(‘\\‘,‘afefc‘) print(ret) ret=re.findall(r‘\‘,‘afefc‘) print(ret) ret=re.findall(‘blow‘,‘blow‘) #不加r,从python开始解释,在python中也是特殊字符,匹配不到blow print(ret) ret=re.findall(r‘blow‘,‘blow‘) #加r,从re开始解释,才能代表re中的特殊字符 print(ret)
10.小括号:() 打包
print(re.search(‘(as)+‘,‘dfasdasasjha‘).group()) #as作为一个整体
11.竖杠:| 代表或者
print(re.findall(‘a|3‘,‘dfsds3k4‘)) print(re.findall(‘a|3‘,‘dfsads3k4‘))
二、正则表达式例子
import re ret=re.search(‘(?P<id>d{3})/(?P<name>w{3})‘,‘wdwds456/l5ffff‘) #(?P<>是一个固定格式,给匹配的内容起名字) print(ret.group()) #打印整体 print(ret.group(‘id‘)) #通过名字打印部分 print(ret.group(‘name‘))
三、正则表达式的方法
1.findall(): 所有满足条件的结果都返回到一个列表里
2.search() : 返回匹配到的第一个对象,该对象可以调用group()查看结果
3.match(): 只在字符串开头匹配
ret=re.match(‘asd‘,‘asddfasd‘) print(ret) print(ret.group()) #返回匹配到的第一个对象,该对象可以调用group()查看结果
4.split() 分割
ret=re.split(‘[j,s]‘,‘hzkjfsh,hg‘) #先用j分,再用逗号分,再用s分 print(ret) ret=re.split(‘[jh]‘,‘hzkjfsog‘) #先用j分出‘hzk‘和‘fsog‘,再用h分它两。边界上会分出空字符 print(ret)
5.sub() 替换
ret=re.sub(‘a..x‘,‘skohhb‘,‘fdalexji‘) print(ret)
6.compile()
ret=re.findall(‘.com‘,‘syeu.comjiijh‘) print(ret) obj=re.compile(‘.com‘) #匹配规则被编译成一个对象 ret=obj.findall(‘syeu.comjiijh‘) #直接用这个对象调用功能,只写字符串就行,不用再写匹配规则。 print(ret) #当多次用到这样的匹配规则时,此法可以起到简化、省时作用
以上是关于正则表达式(re模块)的主要内容,如果未能解决你的问题,请参考以下文章