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 re

re = 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 模块提供的函数对字符串进行匹配、替换和分割操作。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 38. 外观数列(medium)(优质解法)

链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 代码&#xff1a; class Solution {public String countAndSay(int n) {//要进行 n - 1 次描述才能得到结果// last 代表当前要描述的字符串String last"1";// ret 代表描述…

【Git】fatal: bad boolean config value ‘true~‘ for ‘core.longpaths‘

windwos操作系统git config设置错了参数值&#xff0c;解决方法。 出现原因 在拉取代码时&#xff0c;仓库中存在文件名过长得文件&#xff0c;拉取报错了“filename too long” 解决 git config --system core.longpaths true结果在复制命令时&#xff0c;粘贴到命令行多了一…

git 使用方法自用(勿进)本地开发分支推上线上开发分支

一、//查看状态 1.git status 二、//查看改了哪个文件夹 1.git diff 2.//会出现改了哪个文件夹src/components/partials/Slider.js 三、//查看改了的文件夹里面具体改了啥内容 1.git diff src/components/partials/Slider.js 四、提交所有 1. git add . 五、写备注…

【C++】零碎知识点

类对象不能直接访问类的私有成员&#xff0c;不能在类外访问类的私有成员。只有基类的成员函数能访问私有成员&#xff0c;不能被派生类的成员函数访问。 如果在类声明时没有给出成员访问限定符&#xff0c;则默认的成员访问属性是私有的。 常成员函数的定义&#xff1a;int …

Redis数据库——键过期时间

一.设置键的生存时间或者过期时间 我们可以在Redis客户端输入命令&#xff0c;可以以秒或者毫秒精度为数据库中的某个键设置生存时间&#xff0c;在指定秒数或者毫秒数之后&#xff0c;服务器会自动删除生存时间为0的键。 1.1 设置过期时间 Redis有四个不同的命令可以用于设置键…

浅学JWT跨域认证

Json Web令牌简称JWT 由HeaderPayloadSignature组成 Header JWT头是一个描述JWT元数据的JSON对象&#xff0c;alg属性表示签名使用的算法&#xff0c;默认为HMAC SHA256&#xff08;写为HS256&#xff09;&#xff1b;typ属性表示令牌的类型&#xff0c;JWT令牌统一写为JWT。…

AI技术迅猛发展,视频智能化给人类带来了哪些便利?

随着AI技术的迅猛发展&#xff0c;视频智能化也逐渐普及。在我们常见的生产工作和日常生活中&#xff0c;视频智能化都为人类带来了许多便利。今天小编就和大家探讨一下智能化监控带来了哪些便利。 1、安全监控 视频智能化可以实现智能安防监控&#xff0c;例如智慧安防系统Ea…

【并发设计模式】聊聊 基于Copy-on-Write模式下的CopyOnWriteArrayList

在并发编程领域&#xff0c;其实除了使用上一篇中的属性不可变。还有一种方式那就是针对读多写少的场景下。我们可以读不加锁&#xff0c;只针对于写操作进行加锁。本质上就是读写复制。读的直接读取&#xff0c;写的使用写一份数据的拷贝数据&#xff0c;然后进行写入。在将新…

Linux怎么解压zip格式文件?

Linux解压命令zip是一种常见的文件压缩格式&#xff0c;用于把文件打包成一个zip文件&#xff0c;当我们需要共享或是发送时&#xff0c;能够更快速的发送&#xff0c;储存起来能够减少储存空间。那我们在Linux上怎么使用解压命令zip来解压zip格式文件呢&#xff1f;我们一起来…

Web前端VScode/Vue3/git/nvm/node开发环境安装

目录 1 基本配置 2 安装vscode 3 安装vue 4 配置bash 5 安装nvm 6 安装node 7 安装yarn 8 新建项目 9 运行helloworld 1 基本配置 本篇是为了做前端开发的环境而写。使用的操作系统是windows 10 64位 2 安装vscode 现在做vue和node基本就是vscode和webstorm&#x…

入门级:用devEco Studio创建一个鸿蒙APP

文章概叙 本文主要讲的是如何在鸿蒙的开发工具devEco Studio新建一个项目&#xff0c;全文很水&#xff0c;只适合新手!! 开始贴图 假设当前你已经下载好了devEco Studio,但是还没正式开始安装&#xff0c;此时你点击安装包&#xff0c;你会发下如下页面&#xff0c;只需要点…

043、循环神经网络

之——RNN基础 杂谈 第一个对于序列模型的网络&#xff0c;RNN。 正文 1.潜变量自回归模型 潜变量总结过去的信息&#xff0c;再和当前信息一起结合出新的信息。 2.RNN 循环神经网络将观察作为x&#xff0c;与前层隐变量结合得到输出 其中Whh蕴含了整个模型的时序信息&#xf…

10-让Java性能提升的JIT深度剖析

文章目录 JVM的语言无关性解释执行与JITC1、C2与Graal编译器C1编译器C2编译器 分层编译(了解即可)热点代码热点探测方法调用计数器回边计数器 编译优化技术方法内联锁消除标量替换逃逸分析技术逃逸分析的原理逃逸分析 JVM的语言无关性 跨语言&#xff08;语言无关性&#xff0…

【各种**问题系列】Java 数组集合之间的相互转换

&#x1f4cc; 问题点&#xff1a; 在 Coding 过程中经常会遇到数组、List、Set、Map 之间的相互转换......这里记录一下转换的几种方式。&#x1f636;&#x1f636;&#x1f636; 目录 &#x1f4cc; 集合转换 1.数组 转 List&#xff1a; 2.List 转 数组&#xff1a; 3…

【DevOps 工具链】软件版本号命名规范 - 3种规则(读这一篇就够了)

文章目录 1、简述2、常见软件的版本号命名规则3、版本号命名规范整理3.1、XYZ/MMP3.1.1、规则3.1.2、确定3.1.3、举例3.1.4、详细规则 3.2、XYZD/MMPD3.3、VRC3.3.1、规则3.3.2、对"Vxxx"的说明3.3.3、对"Rxxx"的说明3.3.4、对"LLL"的说明3.3.5、…

Databend 开源周报第 125 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 密码策略 Data…

8.21 PowerBI系列之DAX函数专题-帕累托分析

需求 实现 1 按商品小类累积 var rollup_sales calculate(//计算当前累计销售额 [销售额], filter(allselected(order_2[产品小类]),sum(order_2[订单金额])<[销售额]) ) //按小类累积金额,filter内的销售额为选中的各小类的销售额 //金额从大到小累积&#xff0c;用&l…

RabbitMQ如何做到不丢不重

目录 MQTT协议 如何保证消息100%不丢失 生产端可靠性投递 ​编辑 RabbitMQ的Broker端投 &#xff08;1&#xff09;消息持久化 &#xff08;2&#xff09;设置集群镜像模式 &#xff08;3&#xff09;消息补偿机制 消费端 ACK机制改为手动 总结 MQTT协议 先来说下MQTT…

阿里云经济型e实例2核2G3M99元1年,性价比超高的入门级云服务器

产品简介 经济型e实例是阿里云面向个人开发者、学生、小微企业&#xff0c;在中小型网站建设、开发测试、轻量级应用等场景推出的全新入门级云服务器&#xff0c;采用Intel Xeon Platinum架构处理器&#xff0c;支持1:1、1:2、1:4多种处理器内存配比&#xff0c;采用非绑定CPU…

IntelliJ IDEA快捷键及调试

文章目录 一、IntelliJ IDEA 常用快捷键一览表1-IDEA的日常快捷键第1组&#xff1a;通用型第2组&#xff1a;提高编写速度&#xff08;上&#xff09;第3组&#xff1a;提高编写速度&#xff08;下&#xff09;第4组&#xff1a;类结构、查找和查看源码第5组&#xff1a;查找、…