re 模块
Posted yuncong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了re 模块相关的知识,希望对你有一定的参考价值。
正则表达式
元字符
w s d W S D
^ $
|
()
[][^]
量词
* + ?
{n} {n,} {n,m}
贪婪和惰性匹配
- 默认贪婪 :尽可能多的匹配 ---回溯算法
- 惰性匹配:尽可能少的匹配 ----量词?
- .*?x
re 模块
findall:从文件中选取需要的内容
返回一个列表,所有匹配 的项,没有匹配到就返回一个空列表
如果遇到分组,finall会优先显示分组中的内容
(?:正则表达式)取消分组优先
import re ret = re.findall("www.(baidu|oldboy).com","www.baidu.com") print(ret) #[‘baidu‘] 这是因为findall会优先显示分组中的内容 ret = re.findall("www.(?:baidu|oldboy).com","www.baidu.com") print(ret) #[‘www.baidu.com‘] 可以同过?:取消分组的优先级
(?P<组名>正则表达式) 表示个这个组起一个名
(?P=组名)表示引用之前组的名字,引用部分匹配的内容必须和之前那个组名的内容相同
pattern = "<(?P<tag>.*?)>.*?</(?P=tag)>" #pattern = r‘<(.*?)>.*?</1>‘与上面用法一样 ret = re.search(pattern,"<alex>afjsh</alex>") print(ret) #<_sre.SRE_Match object; span=(0, 18), match=‘<alex>afjsh</alex>‘> ret = re.search(pattern,"<alex>afjsh</egon>") print(ret) #None
search: 验证用户输入内容“正则规则$”
返回一个对象,通过.grop()取值
没有匹配到会返回None,没有.grou()方法
所以通常先判断,再取值
if ret:
ret.gout()
如果遇到分组,通过索引可以去各分组的内容
grouo(0) #==group()永远是完整的匹配内容
match 验证用户输入内容
与search功能类型相当于
`search("^d","134afdksj") #==》match("d","134afdksj") 作用是一样的
import re ret = re.match("d+","213asflk32") if ret: print(ret.group()) #213 #等同与 ret = re.search("^d+","213asflk32") if ret: print(ret.group()) #213
切割split
常用来
s1 = "alex8123egon1120boss_jin" ret = re.split("d+",s1) print(ret) #[‘alex‘, ‘egon‘, ‘boss_jin‘] #如果需要保留以什么进行分割的,需要用的分组 ret = re.split("(d+)",s1) print(ret) #[‘alex‘, ‘8123‘, ‘egon‘, ‘1120‘, ‘boss_jin‘]
ret = re.split("[ab]","afsdabcd") print(ret) #[‘‘, ‘fsd‘, ‘‘, ‘cd‘]这里对字符串分割了俩次,先用a分割后再用b来进行分割
替换sub 和subn
#替换sub s = "alex|egon|boss_jin" print(s.replace("|","-")) #alex-egon-boss_jin s1 = "alex8123egon1120boss_jin" ret = re.sub("d+","-",s1) #内部接受四个参数,可以选择替换次数,默认全部替换 print(ret) #alex-egon-boss_jin ret1 = re.subn("d+","-",s1) print(ret1) #(‘alex-egon-boss_jin‘, 2) #subn会返回一个元组,显示替换后的字符串和替换次数
compile 编译正则规则,
运用场景:编译正则规则,对多个字符串进行相同数据查找,节省时间,内存
obj = re.compile("d{3}") #将正则表达式编译成一个正则表达式对象, ret = obj.search("afskj234afjk") print(ret.group()) #234 ret1 = obj.search("afs2155fahfj") print(ret1.group()) #215
finditer #节省空间的方法,可以和compile配合使用
ret = re.finditer("d+","fsa213fajks24fjs243") print(ret)#<callable_iterator object at 0x000002703FFA9390> 一个迭代器 for i in ret: print(i.group()) #213 24 243
以上是关于re 模块的主要内容,如果未能解决你的问题,请参考以下文章