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')
posted @   EJW  阅读(164)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· 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
点击右上角即可分享
微信分享提示