python re模块
一、findall和search
1.1 基础语法
# 还是会按照正则进行匹配
ret = re.findall('[]]','123sdf12312')
print(ret)
ret = re.search('\d+2','123ikhjsdo12312')
print(ret) # 返回一个对象
if ret:
print(ret.group()) #返回第一个符合条件的项
1,1 分组匹配
findall
取所有符合条件的,优先显示分组中的
还是会按照正则进行匹配,只走显示小括号分组后全匹配的内容,提取正真想要的内容 , 取消分组优先显示(?😃
ret = re.findall('9(\d)(?:\d)','9123sdf192312')
print(ret) #?:取消优先匹配,纸打印第一个括号里边的
search
search 只取第一个符合条件的,没有优先这件事儿,得到的结果是一个变量,变量.group()的形式来指定获取第n个分组中匹配到的内容
ret = re.search('(<\w+>)(\w+)<\w+>','<h1>1sdfjsdfjl123dfsdf<h1>')
print(ret) # 返回一个对象
print(ret.group(1)) # 取第一个分组对象
print(ret.group(2)) #取第二个分组对象
例子:通过链家网页源码获取将被平均房价
import re
import requests
from functools import reduce
ret = requests.get('https://cq.lianjia.com/ershoufang/jiangbei/')
ret.content.decode('utf-8')
rea = re.findall('<span>(\d{3})</span>万',ret.content.decode('utf-8'))
#print(rea) # 返回一个对象
count =0
for i in rea:
count= int(i) + count
print(f'江北平均房价为:{count/len(rea)}')
二、split切割
ret = re.split('\d+','laowang222wuger') #以匹配到的内容作为分割符进行切割
print(ret)
三、替换用sub 和 subn
# sub 替换
ret = re.sub('\d+','H','laowang222wuge123r',1) # 表示将匹配到的内容替换成H 最后的1表示需要替换几次
print(ret)
#subn
ret = re.subn('\d+','H','laowang222wuge123r') # 和sub类似,唯一不同的是会显示一共替换了多少此
print(ret)
四、match以什么开头
# match 以什么开头,相当于认为的在正则表达式中添加^ 除此之外和search一模一样,用.group()方式取值,一般规定这个符号必须是什么样的
ret = re.match('\d+','123laowang222wuge123r')
print(ret)
五、compile&finditer
# compile 节约时间
# 假如同一个正则表达式要被解析使用多次,用compile将解析好的正则表达式进行保存,从而节省多次解析同一个正则表达式的时间
ret = re.compile('\d')
res1 = ret.search('123sdf')
res2 = ret.findall('123sdf')
print(res1)
print(res2)
# finditer--节约空间,返回一个迭代器
ret = re.finditer('\d+','sadfw123er1231')
for i in ret:
print(i.group())
# 先compile 再finditer 既节约时间又节约空间
ret = re.compile('\d+')
res = ret.finditer('123dsaf21312sda2')
for r in res:
print(r.group())
六、分组命名
当正则表达式很复杂,分组特别多的时候,就可以用分组命名的方式我们获取想要的数据
ret = re.search('\d(?P<name1>\d)(\w?)','12312sdfaasd') #再分组的最前面加上 ?P<name1>就是将这个组进行命名
print(ret.group('name1')) #用分组名字进行调用
exp = '<abc>sadfasdfw3erweafdfgdsfas</abc>34ew123wred'
ret = re.search('(?P<name1>\w+)>.*?</(?P=name1)>',exp) #当前后匹配的东西一样的时候可以用?P=name1 表示调用前面分组name1匹配到的内容
ret = re.search(r'<(\w+)>.*?</\1>',exp) # \1表示调用第一个分组的内容,和上边效果一样 r表示转意括号里所有特殊字符
print(ret)
print('\1')
本文来自博客园,作者:EJW,转载请注明原文链接:https://www.cnblogs.com/ejjw/p/13418811.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix