re模块(正则)

【 一 】 re模块概述

在线测试工具 正则表达式在线测试 - 站长工具

        随着正则表达式越来越普遍,Python 内置库 re 模块也支持对正则表达式使用

Python 提供了re模块可以支持正则表示表达式使用,re模块提供了9个常量、12个函数

使用方法:

re模块是Pytohon内置库,我们只需要import re就可以直接导入进去正常使用了

re 模块对象组成:

1.正则对象:用于执行正则表达式相关操作的实体

2.匹配对象: 用于存放正在表达式匹配的结果并提供用于获取相关匹配结果的方法

【 二 】re模块的常量

【 三 】 字符组

  • [abc]:匹配字符集合中的任意一个字符,即匹配'a'、'b'或'c'。
  • [^abc]:匹配除字符集合中的任意一个字符以外的字符。
  • [a-z]:匹配指定范围内的任意小写字母。
  • [A-Z]:匹配指定范围内的任意大写字母。
  • [0-9]:匹配指定范围内的任意数字。
  • [a-zA-Z]:匹配指定范围内的任意字母。
  • [a-zA-Z0-9]:匹配指定范围内的任意字母或数字。

元字符:

        元字符是正则表达式中具有特殊意义的字符。它们用于匹配模式中的特定字符或字符集合。以下是一些常见的元字符及其含义:

  1. .(点号):匹配除换行符之外的任意字符。

  2. ^(脱字符):匹配输入字符串的开头。

  3. $(美元符号):匹配输入字符串的结尾。

  4. *(星号):匹配前面的字符零次或多次。

  5. +(加号):匹配前面的字符一次或多次。

  6. ?(问号):匹配前面的字符零次或一次。

  7. {n}:匹配前面的字符恰好 n 次。

  8. {n,}:匹配前面的字符至少 n 次。

  9. {n,m}:匹配前面的字符至少 n 次,但不超过 m 次。

  10. [](方括号):用于定义字符集合,可以匹配其中的任意一个字符。

  11. ()(圆括号):用于分组字符,可以应用其他元字符,如 |*

  12. \(反斜杠):用于转义特殊字符,使其失去特殊意义。

import re# 匹配包含数字和字母的字符串
pattern = r'(?=.*\d)(?=.*[a-zA-Z]).+'
text = "a1b2c3"
result = re.match(pattern, text)if result:print("字符串符合要求")
else:print("字符串不符合要求")

 转义符:

        在正则表达式中,某些字符具有特殊含义,如 .*+?^$[](){} 等。如果想要匹配这些字符本身,而不是它们的特殊含义,需要使用转义符 \

        例如,为了匹配字符串 a.b,可以使用正则表达式 a\.b。在这个表达式中,\. 表示匹配实际的 . 字符,而不是其特殊含义(匹配任意单个字符)。

以下是一些常用的正则表达式转义字符:

        需要注意的是,在 Python 中,反斜杠本身也是一个特殊字符,因此在正则表达式中使用反斜杠时,需要使用两个反斜杠来表示一个。例如,要匹配字符串 C:\Windows\System32,可以使用正则表达式 C:\\Windows\\System32。 

 

量词:

        在正则表达式中,量词(Quantifiers)用于指定模式重复出现的次数。常见的量词包括:

  1. *:匹配前面的模式零次或多次。例如,ab*c可以匹配'ac'、'abc'、'abbc'等。
  2. +:匹配前面的模式一次或多次。例如,ab+c可以匹配'abc'、'abbc'、'abbbc'等。
  3. ?:匹配前面的模式零次或一次。例如,colou?r可以匹配'color'或'colour'。
  4. {n}:匹配前面的模式恰好出现n次。例如,a{3}可以匹配'aaa'。
  5. {n,}:匹配前面的模式至少出现n次。例如,a{2,}可以匹配'aa'、'aaa'、'aaaa'等。
  6. {n,m}:匹配前面的模式出现n到m次。例如,a{2,4}可以匹配'aa'、'aaa'、'aaaa'。

除了上述基本的量词外,还可以使用特殊的量词简化匹配操作,例如:

  • *?:非贪婪模式的零次或多次匹配。
  • +?:非贪婪模式的一次或多次匹配。
  • ??:非贪婪模式的零次或一次匹配。
  • {n}?:非贪婪模式的恰好n次匹配。
  • {n,}?:非贪婪模式的至少n次匹配。
  • {n,m}?:非贪婪模式的n到m次匹配。

以下是一些使用量词的示例:

  • 匹配重复出现的数字:

    • \d+:匹配一个或多个数字。
  • 匹配重复出现的连续字母:

    • [a-z]+:匹配一个或多个小写字母。
  • 匹配重复出现的日期格式:

    • \d{4}-\d{2}-\d{2}:匹配形如'YYYY-MM-DD'的日期。

希望以上解释和示例能帮助你更好地理解和使用正则表达式中的量词。

 

【 四】re模块的编译方法

        Python 内置库re模块提供complie()方法来对正则表达式字符进行编译

re.compile(strPattern[, flag]):

  • strPattern 参数

    1. 这个方法是Pattern类的工厂方法,用于将字符串形式的正则表达式编译为Pattern对象。
    2. 对正则表达式进行编译后,会被提前缓存,重复使用提高效率
  • flag参数

    1. 该参数指定匹配模式,取值可以使用按位运算符'|'表示同时生效,比如re.I | re.M。

    2. 可以在regex字符串中指定模式,比如re.compile('pattern', re.I | re.M)与re.compile('(?im)pattern')是等价的。

import rere = re.compile('正则表达式')
m = re.match('re')

re.complie()会对正则表达提前缓存,提高正则表达式重复使用效率

【 四 】re模块进行只要正则表达式进行被人匹配:

1.编写Python正则表达式字符串re

2.使用re.compile()对正则表达式进行编译成正则对象Pattern ps

3.正则对象ps调用p.match()或者p.fullmatch()函数得到匹配对象Match m

4.通过匹配对象  m 内容进行判断,匹配是否成功

re = "正则表达式"
ps = re.compile(re)
m = ps.match("检测的文本")if m:print(m.group())

re 模块使用正则表达式进行内容查找、替换等操作

  • sp.search("检测内容") 使用编译后的模式 sp 在字符串 "检测内容" 中搜索匹配的第一个结果。返回的结果是一个 Match 对象,可以通过调用对象的方法获取匹配到的结果。

  • sp.findall("检测内容") 使用编译后的模式 sp 在字符串 "检测内容" 中查找所有匹配的结果,并以列表形式返回所有匹配到的子串。

  • sp.finditer("检测内容") 使用编译后的模式 sp 在字符串 "检测内容" 中查找所有匹配的结果,并返回一个迭代器,通过迭代器可以遍历所有匹配的子串。

  • sp.sub("替换内容", "检测内容") 使用编译后的模式 sp 在字符串 "检测内容" 中查找匹配的子串,并将其替换为 "替换内容"。返回替换后的新字符串。

  • sp.subn("替换内容", "检测内容") 使用编译后的模式 sp 在字符串 "检测内容" 中查找匹配的子串,并将其替换为 "替换内容"。返回替换后的新字符串和替换的总次数。

  • sp.split("检测内容") 使用编译后的模式 sp 将字符串 "检测内容" 按照匹配的模式进行分割,返回分割后的子串列表。

ps = '正则表达式'
sp = re.compile(ps)# 查找
mf1 = sp.search("检测内容")
mf2 = sp.findall("检测内容")
mf3 = sp.finditer("检测内容")# 替换
ms = sp.sub("检测内容")
ms2 = sp.subn("检测内容")# 分割
mp = sp.split("检测内容")

具体示例:

import re# 编译正则表达式模式
pattern = re.compile(r'^hello')# 在字符串中查找匹配的子串
text = 'hello world, hello python, hello regex'
match_list = pattern.findall(text)# 输出匹配到的子串列表
print(match_list)  # ['hello', 'hello', 'hello']# 替换匹配到的子串
new_text = pattern.sub('world', text)# 输出替换后的新字符串
print(new_text)  # 'world world, world python, world regex'# ['hello']
# world world, hello python, hello regex

正则表达式方法总结:

  1. re.compile(pattern, flags=0):编译正则表达式模式,返回一个正则表达式对象。

  2. re.search(pattern, string, flags=0):在字符串中搜索模式匹配的第一个位置,返回一个 Match 对象。如果没有匹配到,则返回 None。

  3. re.match(pattern, string, flags=0):从字符串开头开始匹配模式,返回一个 Match 对象。如果没有匹配到,则返回 None。

  4. re.findall(pattern, string, flags=0):查找字符串中所有与模式匹配的子串,并以列表形式返回所有匹配到的子串。

  5. re.finditer(pattern, string, flags=0):查找字符串中所有与模式匹配的子串,并返回一个迭代器,通过迭代器可以遍历所有匹配的子串。

  6. re.sub(pattern, repl, string, count=0, flags=0):使用指定的替换字符串 repl,将字符串中与模式 pattern 匹配的子串替换为替换字符串。可选参数 count 指定最多替换的次数。

  7. re.split(pattern, string, maxsplit=0, flags=0):按照模式匹配的位置,将字符串分割为若干子串,并返回一个列表。可选参数 maxsplit 指定最多分割的次数。

  8. Match.group([group1, …]):返回与模式中的分组对应的子串。可选参数 group 指定要获取的分组,如果未指定,则默认返回整个匹配到的子串。

  9. Match.groups(default=None):返回一个包含所有分组子串的元组。可选参数 default 指定当一个分组未匹配到时的默认值。

  10. Match.groupdict(default=None):返回一个包含所有命名分组的字典。可选参数 default 指定当一个分组未匹配到时的默认值。

【1】匹配邮箱地址

import re# 定义正则表达式模式
pattern = r'^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+$'# 测试样例
emails = ['abc@163.com', '123@qq.com', 'test.mail@gmail.com', 'invalid_email']# 对每个样例进行匹配测试
for email in emails:if re.match(pattern, email):print(f'{email} is a valid email address')else:print(f'{email} is an invalid email address')# abc@163.com is a valid email address
# 123@qq.com is a valid email address
# test.mail@gmail.com is an invalid email address
# invalid_email is an invalid email address

【 2 】匹配HTML标签中的内容

import re# 定义正则表达式模式
pattern = r'<[^>]+>(.*?)</[^>]+>'# 测试样例
html = '<div class="content">Hello, <b>world</b>!</div>'# 查找所有匹配的子串
matches = re.findall(pattern, html)# 输出匹配到的结果
print(matches)  # ['Hello, ', 'world', '!']

【 3 】过滤HTML标签

import re# 定义正则表达式模式
pattern = r'<[^>]+>'# 测试样例
html = '<div class="content">Hello, <b>world</b>!</div>'# 使用 sub() 函数将所有标签替换为空字符串
text = re.sub(pattern, '', html)# 输出替换后的文本
print(text)  # 'Hello, world!'

【 4 】匹配IP地址

import re# 定义正则表达式模式
pattern = r'^((25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)\.){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|\d)$'# 测试样例
ips = ['192.168.0.1', '127.0.0.1', '10.0.0.1', '256.0.0.1', '1.2.3']# 对每个样例进行匹配测试
for ip in ips:if re.match(pattern, ip):print(f'{ip} is a valid IP address')else:print(f'{ip} is an invalid IP address')

        以上是一些常见的正则表达式示例,你可以根据具体需求自定义正则表达式模式,并使用 re 模块提供的函数对字符串进行匹配、替换和分割操作。

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

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

相关文章

FRP 内网穿透指南:简单上手,快速入门

最近受朋友启发&#xff0c;突然萌生了一个想法&#xff0c;那就是如何将家里闲置五六年的台式机给利用起来&#xff0c; 本来打算组装一个NAS存储服务器&#xff0c;但是硬盘实在是有点小贵&#xff0c;所以决定先买了一块799元的4T机械硬盘&#xff0c; 然后做的frp内网穿透&…

同步与互斥(三)

一、递归锁 /* 创建一个递归锁&#xff0c;返回它的句柄。 * 此函数内部会分配互斥量结构体 * 返回值: 返回句柄&#xff0c;非NULL表示成功 */ SemaphoreHandle_t xSemaphoreCreateRecursiveMutex( void );/* 释放 */ BaseType_t xSemaphoreGiveRecursive( SemaphoreHandle_t…

全自动智能四向车系统|海格里斯HEGERLS四向穿梭车机器换人 科技赋能

近年来面对用户小批量、多品种、定制化产品服务需求日渐增多&#xff0c;制造行业仓储库容利用率低、分拣效率低、无法快速响应等问题更加凸显&#xff01;核心设备也由传统货架转变为智能仓储设备立体货架的存储方式&#xff0c;形成更加自动化、智能化的系统集成物流体系。其…

camunda-modeler画图入门

软件下载 camunda-modeler是camunda的工作流绘制桌面工具 5.9.0和5.18.0版本下载地址 https://storage.googleapis.com/downloads-camunda-cloud-release/camunda-modeler/5.9.0/camunda-modeler-5.9.0-win-x64.ziphttps://storage.googleapis.com/downloads-camunda-cloud-…

WAVE SUMMIT+ 2023倒计时2天,传文心一言将曝最新进展!

传文心一言将曝最新进展&#xff01; 亮点一&#xff1a;趋势引领&#xff0c;“扛把子”文心一言将曝新进展亮点二&#xff1a;干货十足&#xff0c;硬核低门槛开发秘籍大放送亮点三&#xff1a;蓄势待发&#xff0c;大模型赋能产业正当时亮点四&#xff1a;群星闪耀&#xff…

什么是波分复用 (WDM) 或密集波分复用 (DWDM)?

波分复用 (WDM) 是一种光纤传输技术&#xff0c;可以使用多个光波长&#xff08;或颜色&#xff09;通过同一介质发送数据。两种或多种颜色的光可以在一根光纤上传播&#xff0c;并且可以在光波导中以光谱上的不同波长或频率传输多种信号。 早期的光纤传输系统通过简单的光脉冲…

408计算机网络错题知识点拾遗

个人向错题相关部分整理&#xff0c;涵盖真题、模拟、课后习题等。 408相关&#xff1a; 408数据结构错题知识点拾遗 408计算机网络错题知识点拾遗 计网复习资料下载整合 已进行资源绑定&#xff0c;相关计网复习资料上方下载。 第一章 计算机网络体系结构 第二章 物理层 第三…

MySQL运维16-双主双从读写分离

一、双主双从架构介绍 在MySQL多主多从的架构配置中和双主双从是一样的&#xff0c;学会了双主双从的架构部署&#xff0c;多主多从的配置也同样就回了。下面以双主双从作为示例演示。其中一个主机maste1用于处理所有写请求&#xff0c;它的从机slave1和另外一台主机master2还有…

【性能测试】真实企业,性能测试流程总结分析(二)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 4、性能测试用例设…

Azure Machine Learning - Azure OpenAI GPT 3.5 Turbo 微调教程

本教程将引导你在Azure平台完成对 gpt-35-turbo-0613 模型的微调。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济本复旦硕&#xff0c;复旦机器人智能实验室成员&#xff0c;阿里云认证的资深架构师&…

Javacv-利用Netty实现推流直播复用(flv)

前言 上一篇文章《JavaCV之rtmp推流&#xff08;FLV和M3U8&#xff09;》介绍了javacv的基本使用&#xff0c;今天来讲讲如何实现推流复用。 以监控摄像头的直播为例&#xff0c;通常分为三步&#xff1a; 从设备获取音视频流利用javacv进行解码&#xff08;例如flv或m3u8&am…

如何实现准时的setTimeout

背景 setTimeout 是不准的。因为 setTimeout 是一个宏任务&#xff0c;它的指定时间指的是&#xff1a;进入主线程的时间。 setTimeout(callback, 进入主线程的时间)所以什么时候可以执行 callback&#xff0c;需要看 主线程前面还有多少任务待执行。 由此&#xff0c;才有了…

MySQL8安装教程

MySQL安装教程 安装环境 Windows 10 软件下载 1、官网下载 官网可以下载最新版本的MySQL 8.0 下载地址&#xff1a; https://dev.mysql.com/downloads/windows/installer/8.0.html 开始安装 1、下载完成后&#xff0c;我们就开始安装&#xff0c;双击安装包&#xff0c…

李宏毅机器学习2023|图像生成模型

文章目录 图像生成Autoregressive&#xff08;各个击破&#xff09;Non-Autoregressive&#xff08;一次到位&#xff09;一次到位法额外的输入——从一个高维的Normal Distribution作simple得到一个向量常用的图片生成模型VAEFlow-based Generative ModelDiffusion ModelGAN D…

跨境电商独立站的6大模式,任你选择!

在几年前搭建跨境电商独立站和第三方平台基本上是同步发展起来的&#xff0c;但在后期的发展过程中&#xff0c;独立站经过不同时期的革新&#xff0c;形成了自己的模式。 当你准备好创建独立站的时候&#xff0c;首先你需要了解的就是独立站运营的模式类型&#xff0c;并找到最…

熟悉DHCP面临的安全威胁与防护机制

一个网络如果要正常地运行&#xff0c;则网络中的主机&#xff08;Host&#xff09;必需要知道某些重要的网络参数&#xff0c;如IP地址、网络掩码、网关地址、DNS服务器地址、网络打印机地址等等。显然&#xff0c;在每台主机上都采用手工方式来配置这些参数是非常困难的、或是…

C/S医院检验LIS系统源码

一、检验科LIS系统概述&#xff1a; LIS系统即实验室信息管理系统。LIS系统能实现临床检验信息化&#xff0c;检验科信息管理自动化。其主要功能是将检验科的实验仪器传出的检验数据经数据分析后&#xff0c;自动生成打印报告&#xff0c;通过网络存储在数据库中&#xff…

什么是数据资产化?数据怎样成为资产?怎样进入资产负债表?

财政部发布的《企业数据资源相关会计处理暂行规定》将从2024年1月1日起开始实施&#xff0c;为企业数据资源入表提供了基本指引&#xff0c;数据资产化有望迎来爆发期。什么是数据资产化&#xff0c;怎样让数据成为资产&#xff0c;成为了众多国有企业、上市公司关心的问题。 —…

JavaScript 中的双等号(==)和三等号(===)有何不同?何时使用它们?

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;JavaScript篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来JavaScript篇专栏内容:JavaScript-等号区别 目录 和 区别&#xff0c;分别在什么情况使用 一、等于操作符…