Python——正则表达式的应用

news2025/4/7 17:58:42

文章目录

  • 前言
  • 正则表达式方法
    • re.search方法
    • group方法
    • re.match方法
    • re.findall方法
    • re.finditer方法
    • re.split方法
    • re.sub方法
  • 正则表达式的应用


前言

提示:这里可以添加本文要记录的大概内容:

正则表达式是字符串处理的有力工具和技术。

使用正在表达式的目的:

1、给定的字符串是否符合正则表达式的过滤逻辑(称作"匹配")。

2、可以通过正则表达式,从字符串中获取我们想要的特定部分。

Python中,re模块import re提供了正则表达式操作所需要的功能。

常用正则表达式
在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

正则表达式方法

re.search方法

扫描整个字符串,搜索匹配第一个位置
返回match对象
re.search(pattern, string, flags=0)

参数说明:
Pattern:要匹配的正则表达式String:要匹配的字符串
Flags:控制正则表达式的匹配方式

【例】http://emotion.bxbw-jyz.cn/Home/index/showPartData.html

打开上面的网站,右键查看页面源代码,找音频编号(我的在61行,或许每个人的都不一样)
在这里插入图片描述

查找音频编号,代码如下(示例):

import requests
import re
def getHTMLContent(url):
    try:
        r=requests.get(url,timeout=30)
        r.raise_for_status()
        return r.text
    except:
        return"访问异常"

if __name__=="__main__":
    url="http://emotion.bxbw-jyz.cn/Home/index/showPartData.html"
    demo=getHTMLContent(url)
    wav_number=re.search(r'音频编号#(.+?)#</b>',demo) # .+?是匹配任意字符,即是上面截图中的#3502#
    print(wav_number)       

在这里插入图片描述

group方法

用来提出分组截获的字符串,()用来分组
正则表达式中的三组括号把匹配结果分成三组
• group() 同group(0)是匹配正则表达式整体结果
• group(1) 列出第一个括号匹配部分
• group(2) 列出第二个括号匹配部分
• group(3) 列出第三个括号匹配部分

【例】http://emotion.bxbw-jyz.cn/Home/index/showPartData.html

打开上面的网站,右键查看页面源代码,找音频编号(我的在第9和第60行,或许每个人的都不一样)

在这里插入图片描述

查找<title>标签和序号开头<b>结尾,代码如下(示例):

import requests
import re
def getHTMLContent(url):
    try:
        r=requests.get(url,tiemout=30)
        r.raise_for_status()
        return r.text
    except:
        return"访问异常"

if __name__=="__main__":
    url="http://emotion.bxbw-jyz.cn/Home/index/showPartData.html"
    demo = getHTMLContent(url)
    wav_number1=re.search(r'序号:(.+?)</b>',demo) #序号开头</b>结尾
    wav_number2=re.search(r'<title>(.+?)</title>',demo) #<title标签>
    print(wav_number1.group(),wav_number2.group())
    print(wav_number1.group(0),wav_number2.group(0))
    print(wav_number1.group(1),wav_number2.group(1))

在这里插入图片描述

re.match方法

从字符串的起始位置(第一个字符)匹配正则表达式
re.match(pattern, string, flags=0)

参数说明
• pattern:要匹配的正则表达式
• string:要匹配的字符串
• flags:控制正则表达式的匹配方式

【例1】http://emotion.bxbw-jyz.cn/Home/index/showPartData.html

打开上面的网站,右键查看页面源代码
从第一个字符开始匹配,匹配:音频编号

import requests
import re
def getHTMLContent(url):
    try:
        r=requests.get(url, timeout=30)
        r.raise_for_status()
        return r.text
    except:
        return "访问异常"
    
if __name__=="__main__":
    url="http://emotion.bxbw-jyz.cn/Home/index/showPartData.html"
    demo=getHTMLContent(url)
    wav_number=re.match(r'音频编号#(.+?)#</b>',demo) # .+?是匹配任意字符
    print(wav_number)

在这里插入图片描述
【例2】http://emotion.bxbw-jyz.cn/Home/index/showPartData.html

多了个切分,从音频编开始切,分为两部分
在这里插入图片描述在这里插入图片描述

import requests
import re
def getHTMLContent(url):
    try:
        r=requests.get(url,timeout=30)
        r.raise_for_status()
        return r.text
    except:
        return"访问异常"

if __name__=="__main__":
    url="http://emotion.bxbw-jyz.cn/Home/index/showPartData.html"
    demo=getHTMLContent(url)
    demo2=demo.split('音频编',1) #切分2部分
    wav_number=re.match(r'号#(.+?)#</b>', demo2[1]) #从头匹配
    print(wav_number)

在这里插入图片描述

re.findall方法

搜索字符串,返回形式为列表
re.findall(pattern, string, flags=0)
参数说明
pattern:要匹配的正则表达式
string:要匹配的字符串
flags:控制正则表达式的匹配方式

【例】http://emotion.bxbw-jyz.cn/Home/index/showPartData.html

要所有的音频编号信息列表

import requests
import re
def getHTMLContent(url):
    try:
        r=requests.get(url,timeout=30)
        r.raise_for_status()
        return r.text
    except:
        return"访问异常"

if __name__=="__main__":
    url="http://emotion.bxbw-jyz.cn/Home/index/showPartData.html"
    demo=getHTMLContent(url)
    wav_number=re.findall(r'音频编号#(.+?)#</b>', demo)
    print(wav_number)

在这里插入图片描述
【例2】http://emotion.bxbw-jyz.cn/Home/index/showPartData.html
在这里插入图片描述
查所有序号、专家ID、专家名字、grade流畅度、音频名字、png图片

# -*- coding: utf-8 -*-
import requests
import re
def getHTMLContent(url):
    try:
        r=requests.get(url,timeout=30)
        r.raise_for_status()
        return r.text
    except:
        return"访问异常"
if __name__=="__main__":
    url="http://emotion.bxbw-jyz.cn/Home/index/showPartData.html"
    demo = getHTMLContent(url)
    #信息提取
    yinpinbianhao = re.findall(r'音频编号#(.+?)#</b>', demo) #拿音频编号
    xuhao = re.findall(r'序号:(.+?)</b>', demo) #拿序号
    zhuanjiaid = re.findall(r'专家ID#(.+?)</b>', demo) #拿专家id
    zhuanjiamingzi = re.findall(r'专家名字_(.+?)</b>', demo) #拿专家名字
    liuchangdu = re.findall(r'form-control" id="(.+?)"', demo) #拿流畅度
    audio_src = re.findall(r'audio src="(.+?)', demo) #拿音频路径
    img_src = re.findall(r'img_src="(.+?)"', demo) #拿图片路径
    for i in range(len(yinpinbianhao)):
        print(xuhao[i],yinpinbianhao[i],zhuanjiaid[i],zhuanjiamingzi[i],liuchangdu[i],audio_src[i],img_src[i])

re.finditer方法

搜索字符串,返回匹配字符串的迭代器。
re.finditer(pattern, string, flags=0)
参数说明
pattern:要匹配的正则表达式
string:要匹配的字符串
flags:控制正则表达式的匹配方式

【例】http://emotion.bxbw-jyz.cn/Home/index/showPartData.html

获取所有信息,返回匹配信息的迭代器

import requests
import re
def getHTMLContent(url):
    try:
        r=requests.get(url,timeout=30)
        r.raise_for_status()
        return r.text
    except:
        return"产生异常"
        
if __name__=="__main__":
    url="http://emotion.bxbw-jyz.cn/Home/index/showPartData.html"
    demo = getHTMLContent(url)
    wav_number = re.finditer(r'音频编号#(.+?)#</b>', demo)
    for wave in wav_number:
        print(wave.group)

在这里插入图片描述

re.split方法

按照匹配的子串,将字符串分割返回列表
re.split(pattern, string, maxsplit=0, flags=0)
参数说明
pattern:匹配模式
string: 待搜索的字符串
maxsplit:最大的分割数

【例1】

import re 
if __name__ == "__main__":
    wav_number = re.split(r'ab(.+?)#','43ab1#ertueab2#tyerab3#gldgk',3)
    wav_number1 = re.split(r'ab','43ab1#ertueab2#tyerab3#gldgfgdfk',3)
    print('wav_number:',wav_number)
    print('len of wav_number:',len(wav_number))
    print(' ---------------')
    print('wav_number1:    ',wav_number1)
    print('len of wav_number1:    ',len(wav_number1))
    wav_number =re.split(r'ab(.+?)#,43ab1#ertueab2#tyerab3#gldgk',3)
    wav_number1 = re.split(r'ab','43ab1#ertueab2#tyerab3#gldgfgdfk',3)

在这里插入图片描述

【例2】http://emotion.bxbw-jyz.cn/Home/index/showPartData.html

爬虫的正则表达式,用re.split方法实现
切片,切100刀,看看能切出多少块,切出的每一块是什么

import requests
import re
def getHTMLContent(url):
    try:
        r=requests.get(url,timeout=30)
        r.raise_for_status()
        return r.text
    except:
        return"访问异常"
        
if __name__=="__main__":
    url="http://emotion.bxbw-jyz.cn/Home/index/showPartData.html"
    demo = getHTMLContent(url)    
    wav_number=re.findall(r'音频编号#(.+?)#</b>', demo)
    print(len(wav_number))
    wav_number1=re.split(r'音频编号#(.+?)#</b>', demo,100)
    print(len(wav_number1))
    print('----------------------')
    print(wav_number1[0])
    print('----------------------')
    print(wav_number1[1])
    print('----------------------')
    print(wav_number1[2])
    print('----------------------')
    print(wav_number1[3])
    print('----------------------')

在这里插入图片描述

re.sub方法

替换所有匹配正则表达式的字串,返回替换后的字符串
re.sub(pattern, repl, string,count=0 , flags=0)
参数说明
pattern:匹配模式
repl : 替换的字符串
String: 待搜索的字符串
count : 替换的最大次数

【例】把匹配出来的信息替换成NID

import requests
import re
def getHTMLContent(url):
    try:
        r=requests.get(url,timeout=30)
        r.raise_for_status()
        return r.text
    except:
        return"访问异常"
        
if __name__=="__main__":
    url="http://emotion.bxbw-jyz.cn/Home/index/showPartData.html"
    demo = getHTMLContent(url)    
    wav_number = re.sub(r'音频编号#(.+?)#</b>','NID',demo)
    wav_number1 = re.findall(r'音频编号#(.+?)#</b>', wav_number)
    wav_number2 = re.findall('NID', wav_number)
    print(len(wav_number1))
    print(len(wav_number2))

在这里插入图片描述


正则表达式的应用

【例1】http://emotion.bxbw-jyz.cn/Home/index/showPartData.html
看selected的都有哪些情绪信息
在这里插入图片描述

import requests
import re
def getHTMLContent(url):
    try:
        r=requests.get(url,timeout=30)
        r.raise_for_status()
        return r.text
    except:
        return"访问异常"
        
if __name__=="__main__":
    url="http://emotion.bxbw-jyz.cn/Home/index/showPartData.html"
    demo = getHTMLContent(url)    
    emotion=re.findall(r'<option.+selected\s*>(.+?)</option', demo) #s后面的*代表空格
    print(emotion)

在这里插入图片描述

【例2】http://emotion.bxbw-jyz.cn/Home/index/showPartData.html
当前音频编号是对应情绪?
在这里插入图片描述

import requests
import re
dict = {}
def getHTMLContent(url):
    try:
        r = requests.get(url,timeout=30)
        r.raise_for_status()
        return r.text
    except:
        return"访问异常"
        
if __name__=="__main__":
    url="http://emotion.bxbw-jyz.cn/Home/index/showPartData.html"
    demo = getHTMLContent(url)   
    wav_number = re.findall(r'音频编号#(.+?)#</b>',demo)
    emotion = re.findall(r'<option.+selected\s*>(.+?)</option>',demo)
    for index in range(len(emotion)):
        print("%s:%s"%(emotion[index],wav_number[index]))

在这里插入图片描述
【例3】http://emotion.bxbw-jyz.cn/Home/index/showPartData.html
把序号、音频编号、情绪都输出

import requests
import re
dict = {}
def getHTMLContent(url):
    try:
        r = requests.get(url,timeout=30)
        r.raise_for_status()
        return r.text
    except:
        return"访问异常"
        
if __name__=="__main__":
    url="http://emotion.bxbw-jyz.cn/Home/index/showPartData.html"
    demo = getHTMLContent(url)  
    name = re.findall(r'>序号:(.+?)</b>', demo)
    yinpinbianhao = re.findall(r'音频编号#(.+?)#</b>', demo)
    plt = re.findall(r'<option.+selected\s*>(.+?)</option>', demo)
    #获取<option>与</option>中带有selected的内容,注意selected后面有0个或多个空格
    for index in range(len(plt)):
        name1=name[index]
        emotion = plt[index]
        yinpinbianhao1=yinpinbianhao[index]
        print("%s:%s:%s"%(name1,emotion,yinpinbianhao1))
        dict[name1]=emotion

在这里插入图片描述

【例4】http://emotion.bxbw-jyz.cn/Home/index/showPartData.html
获取对应的音频链接

src=和class中间的内容,引号会带着(那是字符串)
在这里插入图片描述

import requests
import re
new_wav = []
def getHTMLContent(url):
    try:
        r = requests.get(url,timeout=30)
        r.raise_for_status()
        return r.text
    except:
        return"访问异常"

if __name__=="__main__":
    url="http://emotion.bxbw-jyz.cn/Home/index/showPartData.html"
    demo = getHTMLContent(url) 
    wav_number=re.findall(r'audio src=(.+?)class', demo)
    for index in range(len(wav_number)):
        new_wav_index = "http://emoution.bxbw-jyz.cn" + wav_number[index][1:-2]
        new_wav.append(new_wav_index)
    print(new_wav)

在这里插入图片描述
音频只有一百个,每个音频重复了三次

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/5480.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多态(polymorphic)

目录 1. 多态的基本介绍 2. 多态实现条件 3. 重写 重写的介绍&#xff1a; 【重写和重载的区别】 动、静态绑定机制 5 向上转型和向下转型 向上转型 向上转型的特点&#xff08;总结&#xff09;&#xff1a; 向下转型 多态的优缺点 多态是Java三大基本特征中最抽象…

【数据结构初阶】数组栈和链式队列的实现

努力真的要贯穿人的一生吗&#xff1f; 你能活成你想要的样子吗&#xff1f; 真的不知道&#xff01; 文章目录一、栈的概念及结构二、栈的实现&#xff08;动态数组栈&#xff09;2.1 挑选实现栈的结构2.2 栈结构的定义2.3 初始化栈销毁栈2.4 入栈出栈2.5 判空取栈顶元素栈元…

Android Studio App开发之循环试图RecyclerView,布局管理器LayoutManager、动态更新循环视图讲解及实战(附源码)

运行有问题或需要全部源码请点赞关注收藏后评论区留言~~~ 一、循环视图RecyclerView 尽管ListView和GridView分别实现了多行单列和多行多列的列表&#xff0c;使用也很简单&#xff0c;可是它们缺少变化&#xff0c;风格也比较呆板&#xff0c;为此Android推出了更灵活多变的循…

CAS:1347750-20-2,NH2-PEG-SH,Amine-PEG-Thiol,氨基-聚乙二醇-巯基供应

1、名称 英文&#xff1a;NH2-PEG-SH&#xff0c;Amine-PEG-Thiol 中文&#xff1a;氨基-聚乙二醇-巯基 2、CAS编号&#xff1a;1347750-20-2 3、所属分类&#xff1a; Amine PEG Thiol PEG 4、分子量&#xff1a;可定制&#xff0c;5000、氨基-聚乙二醇 1000-巯基、1000、…

云计算———虚拟化技术镜像的构建及Harbor的使用(三)

一、容器管理 1.1容器命令 docker ps &#xff1a;查看正在运行的容器 &#xff0c;已经关闭的不能查看 docker ps -a&#xff08;显示所有容器&#xff09; 可以 docker -f rm MyWordPress&#xff1a;-f 强制删除容器 [rootlocalhost ~]# docker ps -a -q #显示所有容器只…

java项目-第127期SpringBoot+vue的智慧养老手表管理系统-java毕业设计_计算机毕业设计

java项目-第127期SpringBootvue的智慧养老手表管理系统-java毕业设计_计算机毕业设计 【源码请到资源专栏下载】 本系统主要是通过智能手表监控老人的日常生活&#xff0c;比如血压、心率、睡眠步数、以及摔倒情况。 共分为两个角色&#xff1a;家长&#xff0c;养老院管理员&a…

有含金量的AI证书

文章目录证书展示企业认证介绍华为认证人工智能工程师课程内容我的总结和资料证书展示 这是华为云的AI认证&#xff1a; 这是阿里云的大数据认证&#xff1a; 企业认证介绍 一般的企业是办不起来认证的&#xff0c;大家肯定都知道的。本文主要介绍华为云的认证&#xff0c…

经典动态规划:最长递增子序列

力扣第300题&#xff1a;[最长递增子序列]&#xff0c;这道题是非常经典的动态规划和二分查找的题目&#xff0c;我们先看dp: 第一种解法&#xff1a;动态规划 我们先看题目的示例1&#xff1a; 输入&#xff1a;nums [10,9,2,5,3,7,101,18] 输出&#xff1a;4 解释&#x…

【MySQL】MySQL数据库锁使用与InnoDB加锁的原理解析(MySQL专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

【Spring】Bean 的作用域和生命周期

文章目录1. Bean 的作用域1.1 通过一个案例来看 Bean 作用域的问题1.2 作用域的定义1.3 Spring Bean 支持的作用域&#xff08;未介绍完全&#xff09;1.4 修改 Bean 的作用域1.5 Bean 执行流程2. Bean 的生命周期2.1 Bean 的生命周期分为以下 5 大部分2.1.1 实例化 Bean&#…

【代码精读】在optee中注册一个中断

快速链接: . 👉👉👉 【代码精读】–Kernel/ATF/optee等-目录👈👈👈 付费专栏-付费课程 【购买须知】:本专栏的视频介绍-----视频👈👈👈概要: 在optee os总如何注册一个中断? 有没有类似于request_irq的程序? 注册了该中断后,是哪里将该中断配置成Secure…

保边滤波之基于测地距离的滤波与局部拉普拉斯滤波

&#xff08;1&#xff09;基于测地距离的滤波 给定图像I及其Hard Mask M&#xff0c;其中M(x)∈{0,1} &#xff0c;M(x)0表示x属于前景&#xff0c;M(x)1表示x属于背景&#xff0c;图像中某点x到前面Hard Mask的测地距离为 &#xff1f;&#xff1f;&#xff1f;d(a,b)表示…

机器学习中的数学原理——最小二乘法

这几天在刷B站的时候&#xff0c;有个深度学习的博主推荐了一本机器学习的书——《白话机器学习的数学》&#xff0c;抱着浅看一下的态度&#xff0c;我花3个大洋从淘宝上找到了这本书的电子版。看了两天我直接吹爆&#xff01;&#xff01;&#xff01;所以这个专栏就分享一下…

《Linux驱动:DMA直接内存访问》

目录一、前言二、DMA传输主体三、S3c2440上的DMA3.1 DMA请求源3.2 DMA状态机3.3 DMA请求模式3.4 DMA服务模式3.5 DMA传输模式3.6 DMA读写数据大小3.7 DMA寄存器3.7.1 DCON寄存器其他几个重要位四、使用DMA4.1 软件触发DMA4.2 硬件源触发DMA一、前言 DMA(Direct Memory Aaccess…

SpringMVC框架中的拦截器

目录 1. 拦截器接口的介绍 2. 拦截器接口中方法的详细介绍 3. 配置拦截器的步骤 4. 多个拦截器的的执行情况 5. 拦截器与过滤器的区别 1. 拦截器接口的介绍 2. 拦截器接口中方法的详细介绍 public class MyInterceptor implements HandlerInterceptor {Overridepublic bo…

Elasticsearch学习--script

一、概念 es1.4-5.0&#xff0c;默认脚本语言是Grovvy es5.0&#xff0c;默认脚本语言是painless 二、简单使用 将price减一 # 将id1的price减一 POST goods/_update/1 {"script": {"source": "ctx._source.price - 1"} }# 简写 POST goods/_…

Cloud Computing之时钟和顺序Time and Ordering

文章目录Total orderImplementation of total orderLinearizabilityFIFO rderImplementation of FIFO-orderHappen-before orderingCausal orderingSummary参考文献&#xff1a;Lamport’s logical clock 这章重点介绍了分布式系统下各种类型的时序&#xff0c;其实在分布式场景…

【Linux】网络配置详解

网络配置一.网络连接测试1.查看宿主机和虚拟机ip(1)查看宿主机ip①宿主机:可视化界面查看ip②宿主机:命令行查看ip(2)查看虚拟机ip①虚拟机:可视化界面查看ip②虚拟机:命令行查看ip2.测试宿主机和虚拟机的网络通信(1).宿主机ping虚拟机(2).虚拟机ping宿主机二.网络连接模式1.桥…

420招募线上被试 | 高素质人才行为心理测试

招募中 【实验任务】高素质人才行为心理测试 【实验时长】18分钟 【实验时间】2022年11月12日00时 - 2022年11月20日24时 【实验地点】线上实验 【实验报酬】微信红包&#xff0c;每份问卷3元 【实验要求】如实回答问卷问题&#xff0c;并提供微博账号和微博地址 【被试要…

Js逆向教程-03浏览器调试工具-Source面板

Js逆向教程-03浏览器调试工具-Source面板 切换到source面板&#xff0c;对于source面板&#xff0c;需要打开搜索面板才能发挥出完整的功能。 一、搜索面板 通过点击右上角的按钮&#xff0c;切换到搜索面板 搜索页面的左侧&#xff0c;可以给搜索页面添加其他功能 比如cons…