Python一文轻松搞定正则匹配

一、前言

    日常工作中,不可避免需要进行文件及内容的查找,替换操作,python的正则匹配无疑是专门针对改场景而出现的,灵活地运用可以极大地提高效率,下图是本文内容概览。

二、正则表达式符号

    对于所有的正则匹配表达式,都可由4部分组成:基础字符,次数匹配,位置匹配,分组匹配,即

          正则匹配表达式= 基础字符(必选)+次数匹配(可选)+位置匹配(可选)+分组匹配(可选)

2.1 基础字符

    基础字符主要是对应与具体的匹配对象,常用的如下表,其中涉及有特殊含义的字符,如.,*,^,$等,如果要匹配该字符本身,需要使用转移符号"\"。

代码示例:

import re
string="lucky^ /696/   ^money \Healthy **"
pattern_num=re.compile("\d")  #匹配数字
num=pattern_num.findall(string)
pattern_letter=re.compile("\w")   #匹配字母或数字
letter=pattern_letter.findall(string)
pattern_blank=re.compile("\s")   #匹配空格
blank=pattern_blank.findall(string)
pattern_slash=re.compile(r"\\")    #匹配反斜杠\
slash=pattern_slash.findall(string)
pattern_tri=re.compile("\^")    #匹配特殊字符^
tri=pattern_tri.findall(string)
print("num:%s\nletter:%s\nblank:%s\nslash:%s\ntri:%s"%(num,letter,blank,slash,tri))

查询结果,注意\s表示单个空格,连续两个空格是作为两个结果,单反斜杠\的结果slash表示用“\\”,如果使用print函数打印查看实际是单斜杠\

2.2 匹配次数

    在设置了具体匹配字符后,还可以对字符匹配的数量进行限制,即在匹配字符后面加上匹配次数字符即可

代码示例

import re
string="lucky^ \/696/\   ^money//  \Healthy 12**"
pattern_num=re.compile("\d+")  #匹配至少1个数字
num=pattern_num.findall(string)
pattern_letter=re.compile("\w{4,5}")   #匹配4-5个字母或数字
letter=pattern_letter.findall(string)
pattern_blank=re.compile("\s{3}")   #匹配3个连续的空格
blank=pattern_blank.findall(string)
pattern_slash=re.compile(r"/{2,}")    #匹配至少两个反斜杠//
slash=pattern_slash.findall(string)
pattern_tri=re.compile("\d|\^")    #匹配数字或特殊字符^
tri=pattern_tri.findall(string)
print("num:%s\nletter:%s\nblank:%s\nslash:%s\ntri:%s"%(num,letter,blank,slash,tri))

查询结果

2.3 匹配位置

    同限制匹配字符的数量类似,可以设置匹配字符的位置,如指定开头或结尾的字符

代码示例

import re
string="luckyhappy happy-dog /happy, happy_test ^money  Healthy 12**happy**"
pattern_head=re.compile("^luc")  #匹配以luc开头的字符
head=pattern_head.findall(string)  #匹配成功
print("head",head)
pattern_head1=re.compile("^money")  #匹配以money开头的字符
head1=pattern_head1.findall(string)  #匹配失败
print("head1",head1)
pattern_tail=re.compile("\*$")  #匹配结尾为*的字符
tail=pattern_tail.findall(string)  #匹配成功
print("tail",tail)
pattern_tail1=re.compile("money$")  #匹配结尾为money的字符
tail1=pattern_tail1.findall(string)  #匹配失败
print("tail1",tail1)
pattern_limit=re.compile(r"\bhappy\b")  #匹配字符串中的单词happy,如果happy左右两侧都是字母数字下划线,注意前面需加r
limit=pattern_limit.findall(string)  #匹配成功,其中luckyhappy和happy_test不属于匹配成功的对象
print("limit",limit)

结果

2.3.1 ^与\A,$与\Z

注意^和\A,$和\Z看似都匹配开头和结尾,但在多行模式下存在差异,如下例子

import re
str = "Have a wonderful\nhope in python\nstudy"  #str内容为3行,\n表示换行
# 使用^
print("^ in slnle line:",re.findall("^hope", str))  # 默认单行模式,执照字符串的行首匹配,找不到匹配项
print("^ in multiple line:",re.findall("^hope", str, re.MULTILINE))  # 在多行模式下找到匹配项,会匹配其他行的行首
# 使用\A
print("\A in slnle line:",re.findall("\Ahope", str))  # 默认单行模式,执照字符串的行首匹配,找不到匹配项
print("\A in multiple line:",re.findall("\Ahope", str, re.MULTILINE))  # 在多行模式下,依然不会匹配其他行的行首
# 使用$
print("$ in slnle line:",re.findall("python$", str))  # 默认单行模式,执照字符串的行首匹配,找不到匹配项
print("$ in multiple line:",re.findall("python$", str, re.MULTILINE))  # 在多行模式下找到匹配项,会匹配其他行的行首
# 使用\Z
print("\Z in slnle line:",re.findall("python\Z", str))  # 默认单行模式,执照字符串的行首匹配,找不到匹配项
print("\Z in multiple line:",re.findall("python\Z", str, re.MULTILINE))  # 在多行模式下,依然不会匹配其他行的行首

匹配结果

2.4 分组匹配

示例代码

import re
str = "Zyp Have a 626 wonderful hello hope in python *** study"
pattern=re.compile("(Zyp).*([0-9]{3}).*(\*{3})")    #创建3个group查询
result=pattern.match(str)
print("All content:",result.group(0))   #group[0]为原始字符串
print("Name:",result.group(1))     #查找的结果下标从1开始
print("Value",result.group(2))
print("Count:",result.group(3))

结果

三、匹配函数

    ​前面内容已对匹配表达式进行了介绍,下面将介绍一些常用的查找函数,查找的条件也就是匹配表达式。主要有match,search,findall,finditer,sub,下表是它们之间的差异

3.1 compile

compile函数不是匹配函数,主要是用于生成pattern对象,供匹配函数使用,好处是可以将该规则重复使用。

   语法: re.compile(pattern, flags=0)
            pattern : 匹配规则
            flags : 标志位,默认为0,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

关于其中的flags,可配置如下值

re.I 忽略大小写

re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境

re.M 多行模式

re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符)

re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库

re.X 为了增加可读性,忽略空格和 # 后面的注释

示例代码

import re
str ="Zyp Have a 626 wonderful hello hope in python *** study"
str2="Hwq Have a 888 wonderful hello hope in python * study"
pattern=re.compile("(\w{3}).*([0-9]{3}).*(\*)")    #创建3个group查询
result=pattern.match(str)
result2=pattern.match(str2)    #直接复用pattern,直接修改用于匹配的对象
print("Name:",result.group(1),result2.group(1))     #查找的结果下标从1开始
print("Value",result.group(2),result2.group(2))
print("Count:",result.group(3),result2.group(3))

匹配结果

3.2 match

match需要注意的是匹配是从行首位置开始,如果行首位置不存在匹配的结果,纵使后面存在可匹配的字符,依旧搜索不到,并且如果行首匹配成功,则直接返回结果,只进行一次匹配操作,不会继续对后面的进行匹配,

   语法: re.match(pattern, string, flags=0)
            pattern : 匹配规则
            string : 用于正则匹配的字符串。
            flags : 标志位,默认为0,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

代码示例

匹配结果,返回的结果为一个match对象

3.3 search

search作用与match类似,只进行一次匹配,但不会限制于在行首位置匹配,可在任意位置进行匹配,仍以match中的字符串示例

   语法: re.search(pattern, string, flags=0)
            pattern : 匹配规则
            string : 用于正则匹配的字符串。
            flags : 标志位,默认为0,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

代码示例

匹配结果,两个字符串str,str1都匹配到了符合规则的结果,返回的结果为一个match对象

3.4 findall

findall从名称可看出是查询所有符合的匹配项,并且返回的结果类型为列表,仍以相同的例子为例,多加了一个1314

   语法: re.findall(pattern, string, flags=0)
            pattern : 匹配规则
            string : 用于正则匹配的字符串。
            flags : 标志位,默认为0,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

示例代码

匹配结果,两个字符串的查询结果一致

3.5 finditer

finditer作用与findall相同,也是查询所有符合条件的结果,区别是返回的结果为迭代器,而不是列表。同时迭代表结果的查看可通过函数group或groups进行查看,但groups查看结果,必须匹配规则pattern中设置了分组形式,否则查找的内容为空元组。

   语法: re.finditer(pattern, string, flags=0)
            pattern : 匹配规则
            string : 用于正则匹配的字符串。
            flags : 标志位,默认为0,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

示例代码

匹配结果

3.6 sub

   语法: re.sub(pattern, repl, string, count=0, flags=0)
            pattern : 匹配规则
            repl : 用于替换匹配结果的新字符串。
            string : 用于正则匹配的字符串。
            count : 设置匹配后的替换次数,默认 0 表示替换所有的匹配结果。
            flags : 编译时用的匹配模式。

代码示例

import re
str ="Zyp Have a 626 wonderful hello hope 520 in python 1314*** study"  #str存在2个3位,1个4位的数字,
pattern=re.compile("[0-9]{3}")    #匹配一个3位的数字
result=re.sub(pattern,"999",str,count=2)   #对于查询到的3位数字用999替换,只替换2次
print("result:",result)

替换结果,原先3位的数字前面2个都已替换位999,因只替换2次,第3个1314不进行替换

四、常用场景

下面将针对一些常用的场景提供对应的匹配规则

正则表达式	含义
[3]	匹配数字“3”,即指定匹配的具体数字
[c]	匹配字母“c”,即指定匹配的具体字符
[0-9]	匹配一个数字
[^0-9]	匹配一个除0-9外的字符
[a-z]	匹配一个小写字母
[A-Z]	匹配一个大写字母
[a-zA-Z]	匹配一个字母
[^a-z]	匹配一个非小写字母的字符
^\d{4}-\d{1,2}-\d{1,2}	匹配以“-”形式分隔的日期,如2024-5-2
\d{18}|\d{17}[X]$	匹配出身份证号码
\d+\.\d+\.\d+\.\d+	匹配IP地址
^[A-Za-z0-9\.\+_-]+@[A-Za-z0-9\._-]+\.[a-zA-Z]*$	匹配电子邮箱

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

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

相关文章

强化学习中的自我博弈(self-play)

自我博弈(Self-Play)[1]是应用于智能体于智能体之间处于对抗关系的训练方法,这里的对抗关系指的是一方的奖励上升必然导致另一方的奖励下降。通过轮流训练双方的智能体就能使得双方的策略模型的性能得到显著提升,使得整个对抗系统…

动态规划02(Leetcode62、63、343、96)

参考资料: https://programmercarl.com/0062.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84.html 62. 不同路径 题目描述: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移…

STM32之二:时钟树

目录 1. 时钟 2. STM3时钟源(哪些可以作为时钟信号) 2.1 HSE时钟 2.1.1 高速外部时钟信号(HSE)来源 2.1.2 HSE外部晶体电路配置 2.2 HSI时钟 2.3 PLL时钟 2.4 LSE时钟 2.5 LSI时钟 3. STM32时钟(哪些系统使用时…

html做一个分组散点图图的软件

在HTML中创建一个分组散点图,可以结合JavaScript库如D3.js或Plotly.js来实现。这些库提供了强大的数据可视化功能,易于集成和使用。下面是一个使用Plotly.js创建分组散点图的示例: 要添加文件上传功能,可以让用户上传包含数据的文…

使用 Python 进行测试(6)Fake it...

总结 如果我有: # my_life_work.py def transform(param):return param * 2def check(param):return "bad" not in paramdef calculate(param):return len(param)def main(param, option):if option:param transform(param)if not check(param):raise ValueError(…

matlab入门基础笔记

1、绘制简单三角函数: 绘制正弦曲线和余弦曲线。x[0:0.5:360]*pi/180; plot(x,sin(x),x,cos(x)); (1)明确x轴与y轴变量: 要求为绘制三角函数: X轴:角度对应的弧度数组 Y轴:对应sin(x)的值 求…

python pynput实现鼠标点击两坐标生成截图

脚本主要实现以下功能: 按ctrl开始截图,点击两个坐标,保存截图tk输出截图文本信息,文本输出内容倒序处理默认命名为A0自增。支持自定义名称,自增编号,修改自定义名称自增重新计算清空文本框内容 from pyn…

C++ (week8):数据库

文章目录 一、数据库简介1.数据库2.MySQL(1)数据库的结构(2)MySQL的三种使用方式(3)命令行(4)Navicat Premium 二、SQL1.SQL (Structured Query Language),即结构化查询语言2.数据定义语言 DDL (Data Definition Language) ,创建、修改、删除数据库、表结…

Leetcode3184. 构成整天的下标对数目 I

Every day a Leetcode 题目来源&#xff1a;3184. 构成整天的下标对数目 I 解法1&#xff1a;遍历 统计满足 i < j 且 hours[i] hours[j] 构成整天的下标对 i, j 的数目。 构成整天的条件&#xff1a;(hours[i] hours[j]) % 24 0。 代码&#xff1a; /** lc applee…

20分钟攻破DISCUZ论坛并盗取数据库(web安全白帽子)

20分钟攻破DISCUZ论坛并盗取数据库&#xff08;web安全白帽子&#xff09; 1 快速搭建discuz论坛1.1 攻击思路1.2 快速搭建实验环境1.2.1&#xff0c;漏洞概述1.2.2&#xff0c;在centos7虚拟机上搭建LAMP环境1.2.3&#xff0c;上传到discuz_X2_SC_UTF8.zip 到Linux系统/root下…

JAVA大型医院绩效考核系统源码:​医院绩效考核实施的难点痛点

JAVA大型医院绩效考核系统源码&#xff1a;​医院绩效考核实施的难点痛点 绩效考核数字化综合管理系统是一个基于数字化技术的管理平台&#xff0c;用于帮助企业、机构等组织进行绩效考评的各个环节的管理和处理。它将绩效考评的各个环节集成到一个系统中&#xff0c;包括目标…

RTA_OS基础功能讲解 2.10-调度表

RTA_OS基础功能讲解 2.10-调度表 文章目录 RTA_OS基础功能讲解 2.10-调度表一、调度表简介二、调度表配置2.1 同步三、到期点配置四、启动调度表4.1 绝对启动4.2 相对启动4.3 同步启动五、到期点处理六、停止调度表6.1 重新启动被停止的调度表七、切换调度表八、选择同步策略8.…

【C语言】解决C语言报错:Array Index Out of Bounds

文章目录 简介什么是Array Index Out of BoundsArray Index Out of Bounds的常见原因如何检测和调试Array Index Out of Bounds解决Array Index Out of Bounds的最佳实践详细实例解析示例1&#xff1a;访问负索引示例2&#xff1a;访问超出上限的索引示例3&#xff1a;循环边界…

一颗B+树可以存储多少数据?

一、前言 这个问题&#xff0c;非常经典&#xff0c;考察的点很多&#xff1a; 比如&#xff1a; 1、操作系统存储的单元&#xff0c;毕竟mysql也是运行在操作系统之上的应用。 2、B树是针对Mysql的InnoDB存储引擎&#xff0c;所以要理解InnoDb的最小存储单元&#xff0c;页&…

【Arduino】实验使用ESP32单片机根据光线变化控制LED小灯开关(图文)

今天小飞鱼继续来实验ESP32的开发&#xff0c;这里使用关敏电阻来配合ESP32做一个我们平常接触比较多的根据光线变化开关灯的实验。当白天时有太阳光&#xff0c;则把小灯关闭&#xff1b;当光线不好或者黑天时&#xff0c;自动打开小灯。 int value;void setup() {pinMode(34…

java基于ssm+jsp 美食推荐管理系统

1前台首页功能模块 美食推荐管理系统&#xff0c;在系统首页可以查看首页、热门美食、美食教程、美食店铺、美食社区、美食资讯、我的、跳转到后台等内容&#xff0c;如图1所示。 图1前台首页功能界面图 用户注册&#xff0c;在注册页面可以填写用户名、密码、姓名、联系电话等…

什么是 vCPU?有什么作用

vCPU 是物理 CPU 的虚拟化版本&#xff0c;是云计算的基本组成部分。这些虚拟化计算单元的一大优势是其良好的可扩展性&#xff0c;这也是它们在云托管中发挥重要作用的原因。 vCPU 有什么作用? vCPU(虚拟中央处理器)是物理CPU的虚拟化变体。换句话说&#xff0c;vCPU 是虚拟机…

ctfshow 2023 愚人杯 web

easy_signin 观察url&#xff0c;发现base64 &#xff0c;进行解码&#xff0c;原来可以访问文件路径&#xff0c;那我们访问一下index.php ?imgaW5kZXgucGhw查看源代码发现还是base64 解码得到flag 被遗忘的反序列化 <?php# 当前目录中有一个txt文件哦 error_reporti…

计算机视觉 | 基于图像处理和边缘检测算法的黄豆计数实验

目录 一、实验原理二、实验步骤1. 图像读取与预处理2. 边缘检测3. 轮廓检测4. 标记轮廓序号 三、实验结果 Hi&#xff0c;大家好&#xff0c;我是半亩花海。 本实验旨在利用 Python 和 OpenCV 库&#xff0c;通过图像处理和边缘检测算法实现黄豆图像的自动识别和计数&#xff0…

MarkDown基础

一、MarkDown标题 1.使用和-表示一级标题 2.使用#、##、###、####、######、######表示一级至六级标题 一级标题 二级标题 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 二、MarkDown标题 1.Markdown 段落没有特殊的格式&#xff0c;直接编写文字就好&#xff0c;…