当前位置: 首页 > news >正文

Python(爬虫)正则表达式

正则表达式是文本匹配模式,也就是按照固定模式匹配文本

一、导入

re模块是Python环境的内置模块,所以无需手动安装。直接在文件中导入即可:

import re

二、正则表达式基础知识

. 匹配除换行符以外的任意字符

^ 匹配字符串的开始

$ 匹配字符串的结尾

* 匹配前面的子表达式零次或多次

+ 匹配前面的子表达式一次或多次

? 匹配前面的子表达式零次或一次

{n} n 是一个非负整数。匹配确定的 n 次

{n,} n 是一个非负整数。至少匹配n 次

{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次

[xyz] 字符集合。匹配所包含的任意一个字符 [^xyz] 负值字符集合。匹配未包含的任意字符

\d 匹配一个数字字符。等价于 [0-9]

\D 匹配一个非数字字符。等价于 [^0-9]

\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [\f\n\r\t\v]

\S 匹配任何非空白字符。等价于 [^\f\n\r\t\v]

\w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'

\W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'


例如:

有一个字符串:python pytttthon

正则表达式格式为:pyt{4}hon

那么只有"pytttthon"匹配到

如果正则表达式为:pyt{1,4}hon

那么匹配到的字符串就是python和pytttthon

三、compile

compile()函数用于编译一个字符串形式的正则表达式,将其转换为一个模式对象(Pattern object)。这个模式对象具有匹配(match())、搜索(search())、查找所有(findall())、查找迭代(finditer())以及分割(split())等方法,用于对字符串进行各种基于正则表达式的操作。

案例:

import re
pattern=re.compile(r'\d+')
print(pattern)

上述代码编译了一个字符串:‘\d+’为正则表达式,字符串前的r:代表是原始字符,通常与转义字符联用,当不加r时使用转义字符需要使用两个\,并返回一个对象给pattern。这个正则表达式的意义为:找到一个数字或多个数字的字符串。输出pattern:

re.compile('\\d+')

四、compile中的方法使用

1、match方法

match方法是用来按顺序从头匹配字符串的。不会全部匹配,而是找到第一个符合正则格式的字符串就返回。

案例1:

import re
pattern=re.compile(r'\d+')
m1=pattern.match('one123two457three89')
#因为o不是数字,所以无匹配数据
print(m1)

.match中是要匹配格式的字符串,通过上文,我们可知,这个代码是要找一个带有数字的字符串,且match是从头开始匹配,所以在匹配第一个字符时发现不是数字,所以直接返回。

导致输出结果为:None

案例2,按索引查询:

import re
pattern=re.compile(r'\d+')
m1=pattern.match('one123two457three89',3,6)
print(m1.group())#通过group查看匹配的数据

match函数的参数:(要匹配的字符串,开始索引,结束索引),开始和结束索引是前闭后开集合,也就是包括开始索引字符,不包括结束索引字符。上述代码实现了从索引值为3的字符开始,到6结束,不包括6。.group是查看匹配的数据

输出:123

如果不写.group输出:<re.Match object; span=(3, 6), match='123'>

2、search方法

search方法也是搜索匹配字符串,但是与match不同,他是整体的字符串匹配,但只返回第一个匹配的字符串。

import re
pattern=re.compile(r'\d+')
s1=pattern.search('one123two457three89')
print(s1)

输出:123。因为search不是从头开始严格匹配,所以就会匹配到123。

3、findall方法

findall也是用来检索匹配字符串的,而且他会返回所有符合条件的字符串。并且返回一个列表。

案例:

import re
pattern=re.compile(r'\d+')
f1=pattern.findall('one123two457three89')
print(f1)

上述代码是要匹配所有是数字的字符串,但返回的是一个列表,所以输出形式为:

['123', '457', '89']

4、split方法

split方法是分隔字符串的,并且返回一个列表。这个方法不归属于正则表达式。

比如我们要按逗号分隔一个字符串:

import re
str='a,b,c'
print(str.split(','))

那么我们就可以得到一个列表:['a', 'b', 'c']

但是如果分隔符是多种的,我们就需要用到正则表达式了

案例:

import re
str='a,b;;c d'
pattern=re.compile(r'[\s\,\;]+')
print(pattern.split(str))

如果我们要将str中的abcd作为单独元素分隔,但他们之间的分隔符不一样,那么我们就可以将分隔符写到正则表达式中。上述代码将空格逗号分号作为分隔符写入正则表达式。那么我们将返回的pattern对象打点调用split就可以按照pattern格式分隔,split()括号中填入要分割的字符串。因为字符串中可能两个或多个分隔符连着使用,所以后边加上一个加号用来匹配一次或多次。

输出:['a', 'b', 'c', 'd']

5、sub方法

sub方法是用来替换字符串的,sub方法中有三个参数:参数一:替换后的值,参数二:原值,参数三:替换几个。参数一既可以传值也可以穿函数

案例1:

string='<h1 class="test">1 helloworld</h1>'
pattern=re.compile(r'\d')
print(pattern.sub('2',string))
print(pattern.sub('2',string,1))

上述代码的第一个sub方法是要将string字符串中的所有数字都换成2,第二个sub方法是将string字符串中的第一个数字替换成2。

输出:<h2 class="test">2 helloworld</h2>
           <h2 class="test">1 helloworld</h1>

五、分组

.group方法是将检索出来的字符串按组取出

在写正则表达式时我们可以将字符串进行分组

案例:

string='<h1 class="test">1 helloworld</h1>'
pattern=re.compile(r'<(.\d)\sclass="(.*?)">.*?</(.1)>')#p给组起名字:classname,可以通过名字调用该组
print(pattern.search(string).group(1))

上述代码的结果:test。在写正则表达式时我们可以用括号对字符串进行分组,数字代表第几组,上述代码是要第一组,也就是class后面括号内的内容,在匹配时,匹配到class后边的组括号。

我们也可以给组起名,用分组名

pattern=re.compile(r'<(.\d)\sclass="(?P<classname>.*?)">.*?</(.1)>')
print(pattern.search(string).group('classname'))

上述代码跟上一个案例的结果一样

sub方法补充(参数一传函数时):

sub方法中 参数1函数名,是对字符串的替换规则。参数2是要操作的字符串,将sub(str)的结果传入到第一个参数中,返回第一个参数的结果。将匹配的结果传入func方法中,对传入的数据操作,这个方法的内容就是替换规则。替换后的语句就是func的返回值。

import re
string='<h1 class="test">1 helloworld</h1>'
pattern=re.compile(r'<(.\d)\sclass="(?P<classname>.*?)">.*?</(.1)>')
def func(m):#m是要匹配的格式return "after sub:"+m.group('classname')
#sub方法中传入函数
#参数一:函数名,参数二:原字符串
print(pattern.sub(func,string))

上述代码输出:after sub:test

六、防止贪婪模式:?

import re
string='<h1 class="test">1 helloworld</h1>'
pattern=re.compile(r'<.\d\sclass=.*>')
print(pattern.search(string).group())
#'?'防止贪婪匹配
pattern=re.compile(r'<.\d\sclass=.*?>')
print(pattern.search(string).group())

上述代码第一个输出语句为string完整字符串,而第二个输出语句为:<h1 class="test">。因为第一个是贪婪模式,当出现重复的结尾字符时,他会匹配到最后一个>符号,而加上问号,他会匹配到离他最近的那个。

相关文章:

Python(爬虫)正则表达式

正则表达式是文本匹配模式&#xff0c;也就是按照固定模式匹配文本 一、导入 re模块是Python环境的内置模块&#xff0c;所以无需手动安装。直接在文件中导入即可&#xff1a; import re 二、正则表达式基础知识 . 匹配除换行符以外的任意字符 ^ 匹配字符串的开始 $ 匹配字…...

Linux:进程(二)

目录 一、cwd的理解 二、fork的理解 1.代码共享 2.各司其职 3.fork的返回值 三、进程状态 1.进程排队 2.进程状态 运行状态 阻塞状态 挂起状态 一、cwd的理解 cwd&#xff08;current working directory&#xff09;。译为当前工作目录。 在C语言中&#xff0c;使用…...

【UE5】将2D切片图渲染为体积纹理,最终实现使用RT实时绘制体积纹理【第二篇-着色器制作】

在上一篇文章中&#xff0c;我们已经理顺了实现流程。 接下来&#xff0c;我们将在UE5中&#xff0c;从头开始一步一步地构建一次流程。 通过这种方法&#xff0c;我们可以借助一个熟悉的开发环境&#xff0c;使那些对着色器不太熟悉的朋友们更好地理解着色器的工作原理。 这篇…...

【OceanBase 诊断调优】—— GC问题根因分析

GC 流程涉及到 RS 的状态切换和 LS 的资源安全回收&#xff0c;流程上较长。且 GC 线程每个租户仅有一个&#xff0c;某个日志流 GC Hang 死时会卡住所有其余日志流的 GC&#xff0c;进而造成更大的影响。 本文档会帮助大家快速定位到 GC 故障的模块&#xff0c;直达问题核心。…...

图像面积计算一般方法及MATLAB实现

一、引言 在数字图像处理中&#xff0c;经常需要获取感兴趣区域的面积属性&#xff0c;下面给出图像处理的一般步骤。 1.读入的彩色图像 2.将彩色图像转化为灰度图像 3.灰度图像转化为二值图像 4.区域标记 5.对每个区域的面积进行计算和显示 二、程序代码 %面积计算 cle…...

指挥平台在应急场所中的主要表现有哪些

在应对自然灾害、公共安全事件等突发危机时&#xff0c;指挥平台作为应急管理体系的核心枢纽&#xff0c;其重要性不言而喻。它不仅承载着信息的快速汇聚、精准分析与高效调度功能&#xff0c;更在应急场所中有一定的关键表现。接下来就跟着北京嘉德立一起了解一下。 一、信息集…...

智能养殖场人机交互检测系统源码分享

智能养殖场人机交互检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Co…...

数据集-目标检测系列-海洋鱼类检测数据集 fish>> DataBall

数据集-目标检测系列-海洋鱼类检测数据集 fish>> DataBall 数据集-目标检测系列-海洋鱼类检测数据集 fish 数据量&#xff1a;1W 数据项目地址&#xff1a; gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview github: https://github.com/…...

网络威慑战略带来的影响

文章目录 前言一、网络威慑的出现1、人工智能带来的机遇二、网络空间的威慑困境1、威慑概念的提出2、网络威慑的限度3、人类对网络威胁的认知变化4、网络空间的脆弱性总结前言 网络威慑是国家为应对网络空间风险和威胁而采取的战略。冷战时期核威慑路径难以有效复制至网络空间…...

决策树算法在机器学习中的应用

决策树算法在机器学习中的应用 决策树&#xff08;Decision Tree&#xff09;算法是一种基本的分类与回归方法&#xff0c;它通过树状结构对数据进行建模&#xff0c;以解决分类和回归问题。决策树算法在机器学习中具有广泛的应用&#xff0c;其直观性、易于理解和实现的特点使…...

Leetcode面试经典150题-39.组合总数进阶:40.组合总和II

本题是扩展题&#xff0c;真实考过&#xff0c;看这个题之前先看一下39题 Leetcode面试经典150题-39.组合总数-CSDN博客 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数…...

ProcessOn为什么导出有水印!!!(利用SVG转PNG)

processon-svg2png ProcessOn 一个非常好用的思维导图网站&#xff0c;但是为什么导出有水印&#xff01;&#xff01;&#xff01;。 功能 支持按钮拖拽支持将流程图svg 转成 png下载支持修改自定义文字下载svg&#xff08;开发中&#xff09; 安装/使用方法 安装并使用…...

插入、更新与删除MySQL记录

在现代应用开发中,数据库操作是非常重要的一环。作为程序员,熟练掌握数据库的增删改功能,能够更有效地管理数据并提高开发效率。 本课程将围绕插入、更新与删除记录这三个操作展开,涵盖SQL中的常见语句:INSERT INTO、UPDATE 和 DELETE,并结合实际应用中的常见问题讨论如…...

【ARM】armv8的虚拟化深度解读

Type-1 hypervisor Type-1虚拟化也叫做Bare metal, standalone, Type1 Type2 hypervisor Type-2虚拟化也叫做hosted, Type-2 VM和vCPU(虚拟机和虚拟cpu) 在一个VM&#xff08;虚拟机&#xff09;中有多个vCPU&#xff0c;多个vCPU可能属于同一个Vritual Processor。 EL2…...

9/24作业

1. 分文件编译 分什么要分文件编译&#xff1f; 防止主文件过大&#xff0c;不好修改&#xff0c;简化编译流程 1) 分那些文件 头文件&#xff1a;所有需要提前导入的库文件&#xff0c;函数声明 功能函数&#xff1a;所有功能函数的定义 主函数&#xff1a;main函数&…...

Leetcode 106. 从中序与后序遍历序列构造二叉树

给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], postorder [9,15,7,20,3] 输出&#xff1a;[3…...

针对考研的C语言学习(定制化快速掌握重点1)

1.printf函数的几个要点 printf函数中所有的输出都是右对齐的&#xff0c;除非在%后面添加负号&#xff0c;则表示左对齐 #include<stdio.h> int main() {int num 10;int nums 100;float f 1000.2333333333;printf("%3d\n", nums);//%3d表示输出的总宽度至…...

【大数据入门 | Hive】DDL数据定义语言(数据库DataBase)

1. 数据库(DataBase) 1.1 创建数据库 语法&#xff1a; CREATE DATABASE [IF NOT EXISTS] database_name [COMMENT database_comment] [LOCATION hdfs_path] [WITH DBPROPERTIES (property_nameproperty_value, ...)]; 案例&#xff1a; &#xff08;1&#xff09;创建一个…...

CNVD漏洞和证书挖掘经验总结

前言 本篇文章主要是分享一下本人挖掘CVND漏洞碰到的一些问题&#xff0c;根据过往成功归档的漏洞和未归档的漏洞总结出的经验&#xff0c;也确实给审核的大佬们添了很多麻烦&#xff08;主要真的没人教一下&#xff0c;闷着头尝试犯了好很多错误&#xff0c;希望各位以后交一个…...

阿里rtc旁路推流TypeScript版NODE运行

阿里云音视频服务云端录制typescript版本; 编译后可以使用 node index.js运行 package.json 版本 // npm install --save alicloud/rtc201801112.3.0 "alicloud/rtc20180111": "^2.3.0",引入 import Client, { StartCloudRecordRequest, StopCloudRecord…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...

基于Uniapp的HarmonyOS 5.0体育应用开发攻略

一、技术架构设计 1.混合开发框架选型 &#xff08;1&#xff09;使用Uniapp 3.8版本支持ArkTS编译 &#xff08;2&#xff09;通过uni-harmony插件调用原生能力 &#xff08;3&#xff09;分层架构设计&#xff1a; graph TDA[UI层] -->|Vue语法| B(Uniapp框架)B --&g…...

RKNN开发环境搭建2-RKNN Model Zoo 环境搭建

目录 1.简介2.环境搭建2.1 启动 docker 环境2.2 安装依赖工具2.3 下载 RKNN Model Zoo2.4 RKNN模型转化2.5编译C++1.简介 RKNN Model Zoo基于 RKNPU SDK 工具链开发, 提供了目前主流算法的部署例程. 例程包含导出RKNN模型, 使用 Python API, CAPI 推理 RKNN 模型的流程.   本…...

华为云Flexus+DeepSeek征文 | 基于Dify构建具备联网搜索能力的知识库问答助手

华为云FlexusDeepSeek征文 | 基于Dify构建具备联网搜索能力的知识库问答助手 一、构建知识库问答助手引言二、构建知识库问答助手环境2.1 基于FlexusX实例的Dify平台2.2 基于MaaS的模型API商用服务 三、构建知识库问答助手实战3.1 配置Dify环境3.2 创建知识库问答助手3.3 使用知…...