【python】一篇玩转正则表达式

news2025/7/12 18:45:30

cc8b9af695d241f1abcc6a424efd5529.jpeg

目录

前言

正则表达式

行定位符

1.^

2.$

元字符

常见的元字符

限定符

常用的限定符

字符类

排除字符

选择字符

转义字符

()

python使用正则表达式

匹配字符串

match()

search()

findall()

sub()

替换敏感字符

 split()


3d308fb387994e878f3968be162983ed.gif

前言

正则表达式(Regular Expression),又称规则表达式,它不是某个编程语言所特有的,是计算机科学的一个概念,通常被用来检索和替换符合某些规则的文本。

正则表达式

行定位符

1.^

表示行的开始

2.$

表示行的结尾

举例

^py该表达式表示要匹配字符串py的开始位置是行头,如py equal python可以匹配而python equal py不能匹配

py$后者可以匹配,前者不能,如果要匹配的字符串可以出现在字符串的任意部分,那么可以直接写成py

元字符

常见的元字符

元字符说明
.匹配除换行符以外的任意字符
\w匹配字母或数字或下划线或汉字
\s匹配任意的空白符
\d匹配数字
\b匹配单词的开始或结束
^匹配字符串的开始
$匹配字符串的结束

限定符

如果想匹配特定数量的数字,需要使用限定符(指定数量的字符)来实现,例如匹配8位QQ号就是:^\d{8}$

^表示行的开始,\d表示匹配数字,{8}就是限定符表示匹配前面的字符8次,$表示行的结束

常用的限定符

限定符说明举例
匹配前面的字符零次或一次pytho?n,可以匹配为python或pythn
+匹配前面的字符一次或多次py+thon,可以匹配为python到pyy...thon
*匹配前面的字符零次或多次py*thon,可以匹配为pthon到pyy...thon
{n}匹配前面的字符n次py{2}thon,只能匹配pyython
{n,}匹配前面的字符最少n次py{2,,}thon,可以匹配pyython到pyy...thon
{n,m}匹配前面的字符最少n次,最多m次python{0,2},可以匹配pytho、python、pythonn三种情况

字符类

正则表达式查找数字和字母是简单的事,因为有元字符,但是如果没有预定义元字符的字符合集(比如元音字母),那该怎么办呢?

也简单,在方括号里列出他们,[aeiou]就是匹配元音字母,[0-9]代表的含义就和\d完全一致,代表一个数字,[a-z0-9A-Z_]等同于\w(不考虑汉字),如果想匹配任意一个汉字,可以使用[\u4e00-\u9fa5],匹配多个汉字,只需在前面的基础上加个+即[\u4e00-\u9fa5]+

排除字符

匹配不符合指定字符集合的字符串,^放在方括号表示排除的意思

举例

[^a-zA-Z]表示匹配一个不是字母的字符

选择字符

如果我们想要它匹配的结果是多种,就需要使用选择字符(|)该字符是或的意思

举例

身份证的长度为15位或18位,其中15位全为数字,18位分为全为数字和前17位为数字最后一位可能是数字或字符X,那么匹配的表达式可写为:

(^\d{15}$)|(^\d{18}$)|(^\d{17})(\d|X|x)$

转义字符

转义字符的作用就是将特殊字符(如“.”“?”“\”)变为普通的字符,例如匹配QQ邮箱:

^[1-9]\d{4,10}@qq\.com$

括号在正则表达式也算是元字符

()

作用一:改变限定符的作用范围

作用二:分组,也就是子表达式(\.[0,9]{1,4}){4},就是对其进行重复操作

python使用正则表达式

匹配字符串

match()

从字符串的开始处进行匹配,如果起始位置匹配成功,则返回Match对象,否则返回None。语法格式如下:

re.match(pattern,string,[flags])

pattern:表示模式字符串,由要匹配的正则表达式转换而来

string:表示要匹配的字符串

flags:表示标志位,用于控制匹配方式,如是否区分字母大小写

常用标志

标志说明

A或ASCII

对\w,\b,\d,\s只进行ASCII匹配
I或IGNORECASE不区分字母大小写
M或MULTILINE将^和$用于包括整个字符串的开始和结尾的每一行
S或DOTALL使用“.”字符匹配所有字符,包括换行符
X或VERBOSE忽略模式字符串中未转义的空格和注释

举例

匹配字符串是否以“mr_”开头,不区分字母大小写

代码

import re
pattern='mr_\w+'
string='MR_SHOP mr_shop'
match=re.match(pattern,string,re.I)
print(match)
print('匹配值的起始位置:',match.start())
print('匹配值的结束位置:',match.end())
print('匹配位置的元组:',match.span())
print('要匹配的字符串:',match.string)
print('匹配数据:',match.group())
string='名称 MR_SHOP mr_shop'
match=re.match(pattern,string,re.I)
print(match)

执行结果

a0a27de04545422794cb44c55c38e063.png

search()

在整个字符串中搜索第一个匹配的值,如果在起始位置匹配成功,则返回Match(),否则返回None,语法格式如下:

re.search(patter,string,[flags])

pattern:表示模式字符串,由要匹配的正则表达式转换而来

string:表示要匹配的字符串

flags:表示标志位,用于控制匹配方式,如是否区分字母大小写

 举例

搜索第一个以“mr_”开头的字符串,不区分字母大小写

代码

import re
pattern='mr_\w+'
string='MR_SHOP mr_shop'
search=re.search(pattern,string,re.I)
print(search)
string='名称 MR_SHOP mr_shop'
search=re.search(pattern,string,re.I)
print(search)

执行结果

039bb1629a2544a2b3304041b9ad394b.png

findall()

在整个字符串中搜索 所有符合正则表达式的字符串,并以列表的形式返回,如果匹配成功,则返回包含匹配结构的列表,否则返回空列表,语法格式如下:

re.findall(pattern,string,[flags])

pattern:表示模式字符串,由要匹配的正则表达式转换而来

string:表示要匹配的字符串

flags:表示标志位,用于控制匹配方式,如是否区分字母大小写

举例

搜索以“mr_”开头的字符串

代码

import re
pattern='mr_\w+'
string='MR_SHOP mr_shop'
findall=re.findall(pattern,string,re.I)
print(findall)
string='名称 MR_SHOP mr_shop'
findall=re.findall(pattern,string)
print(findall)

执行结果

8398468705c1417c990f69a4cbfe6e2f.png

sub()

实现字符串替换,语法格式如下:

re.sub(patter,repl,string,count,flags)

pattern:表示模式字符串,由要匹配的正则表达式转换而来

repl:表示替换的字符串

string:表示要被查找替换的原始字符串

count:可选参数,表示模式匹配后替换的最大次数,默认值为0

flags:表示标志位,用于控制匹配方式,如是否区分字母大小写

举例

隐藏快递里的手机号码

代码

import re
pattern='1[34578]\d{5}'
string='快递号:7-1563 联系电话:18888358853'
result=re.sub(pattern,'1XXXXXX',string)
print(result)

执行结果

5602d53a3db94021b5b719ddd3a83c80.png

替换敏感字符

代码

import re
pattern='淘宝'
string='我在淘宝买东西'
result=re.sub(pattern,'某宝',string)
print(result)

 执行结果

18ebf94d4d7a4a0dbd6fb5023b792182.png

 split()

根据正则表达式分割字符串,并以列表的形式返回,语法格式如下:

re.split(pattern,string,[maxsplit],[flags])

pattern:表示模式字符串,由要匹配的正则表达式转换而来

string:表示要匹配的字符串

maxsplit:可选参数,表示最大的拆分次数

flags:表示标志位,用于控制匹配方式,如是否区分字母大小写

举例

对给定的url地址中提取请求地址和各个参数

代码

import re
pattern='[?|&]'
url='http://www.baidu.com/login?username="zhangsan"&pwd="password"'
result=re.split(pattern,url)
print(result)

执行结果

a3415c4f2d034abf9ae52ec2a504de59.png

👍+✏️+⭐️是对博主最大的鼓励与支持!!!

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

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

相关文章

柯桥托业TOEIC考试和PETS哪个含金量高?

说到对职场有益的证书,无外乎托业和BEC证书。但还有一种面向社会人士的考试,也有很多小伙伴很感兴趣。那就是PETS考试。 很多小伙伴也很好奇托业和PETS的区别,今天来给大家科普下喽。 TOEIC-托业考试 托业考试由美国教育考试服务中心(ETS)开…

LaTeX使用(公式,表格,图片,中文字符)

是一种基于ΤΕΧ的排版系统,由美国计算机学家莱斯利兰伯特(Leslie Lamport)在20世纪80年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由TeX所提供的强大功能,能在几天、甚至…

HTML小游戏8 —— 小霸王游戏机网页版(附完整源码)

💂 网站推荐:【神级源码资源网】【摸鱼小游戏】🤟 风趣幽默的前端学习课程:👉28个案例趣学前端💅 想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】💬 免费且实用的计算机相关知…

RabbitMQ-04 Hello,World

首先我们还是先看一下Rabbitmq的工作原理图 从图上我们可以看到,无论是生产者还是消费者我们都需要进行connection并且获取相应的channel,所以为了方便,建议把这部分操作抽取成一个工具类RabbitMqUtils。 工具类RabbitMqUtils public class…

【C++笔试强训】第二十五天

🎇C笔试强训 博客主页:一起去看日落吗分享博主的C刷题日常,大家一起学习博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话:夜色难免微凉,前方必有曙光 🌞。 💦&a…

S7-1200通过MODBUS转PROFINET网关控制英威腾GD200A变频器的具体方法示例

S7-1200通过MODBUS转PROFINET网关控制英威腾GD200A变频器的具体方法示例 需要的设备: 西门子S7-1200PLC一台 MODBUS转PROFINET网关一台 英威腾GD200A变频器一台 具体配置方法: 1、 如下图所示,打开博途软件,新建项目并添加网关的gsd文件; 2、 如下图所示,建立profinet连…

Gradle介绍1-入门和IDEA整合(Gradle Wrapper)

1. Gradle 入门 1.1、Gradle 简介 Gradle 是一款Google 推出的基于 JVM、 通用灵活的项目构建工具, 支持 Maven,JCenter 多种第三方仓库;支持传递性依赖管理、废弃了繁杂的xml 文件,转而使用简洁的、支持多种语言(例如:java、gr…

前端—微信小程序开发

随着微信的普及和微小程序的广泛应用,微信小程序开发越来越多受到人们的关注,正在成为新工科和人工智能背景下当代大学生的必备技能。 适应对象 该课程适合电子信息类专业学生进行学习。 微信小程序开发课程共六章,通过对微信小程序开发的…

Java继承

一、知识点 继承是Java面向对象编程的一块基石,因为它允许创建分等级层次的类。继承可以理解为一个对象从另一个对象获取属性的过程。 如果类A是类B的父类,而类B是类C的父类,我们也称C是A的子类,类C是从类A继承而来的。在Java中&a…

理解case when then else end 的使用,基础概念,建表语句,用例讲解

文章目录一、基础概念二、建表语句三、用例讲解参考文档一、基础概念 case :表示需要处理的字段when :表示条件then :表示当when执行为true时,再执行的语句else :表示当所有的when执行为false时,再执行的语…

Go分布式缓存 一致性哈希(hash)(day4)

Go分布式缓存 一致性哈希(hash)(day4) 1 为什么使用一致性哈希 今天我们要实现的是一致性哈希算法,一致性哈希算法是 GeeCache 从单节点走向分布式节点的一个重要的环节。那你可能要问了, 童鞋,一致性哈希算法是啥?为什么要使用…

基于几何约束的传动机构设计

本文介绍如何使用参数化 CAD 软件中几何约束的强大功能来加速机构的开发。 许多 CAD 程序提供了用于分析和改进机制的工具。但是,这些假设你已经有了初始设计。合成机构的经典图形方法提供了确定连杆长度和关节位置以产生特定运动的方法。 这些方法可以使用参数化…

工作这么久了,还不懂多线程吗?

浩哥Java多线程整理学习系列之01 基础知识整理 浩哥Java多线程整理学习系列之01基础知识整理1. 如何查看电脑核数及线程数Linux查询CPU核心数2. 线程和进程、协程之间的区别3. 时间片轮转(RR)调度算法4. 并行和并发的区别5. 系统限制线程数6. 并发的优缺…

[go学习笔记.第十四章.协程和管道] 1.协程的引入,调度模型以及运行cpu数目,协程资源竞争问题

1.先看一个需求 需求: 要求统计 1~9000000000 的数字中,哪些是素数? 分析思路: (1).传统的方法,就是使用一个循环,循环的判断各个数是不是素数.(很慢) (2).使用并发或者并行的方式,将统计素数的…

CEX暴雷怎么办 一文读懂加密钱包产业现状

你的钱其实并不在你的借记卡里,借记卡只是授权你的银行帐户向银行系统数据库发送交易。同样,你的代币也并不在你的加密钱包里。加密钱包只是持有私有密钥以证明对数字资产的所有权,而这些资产是存储在公共区块链网络上的。私钥能让你对加密钱…

详细介绍BERT模型

文章目录BERT简介BERT, OpenAI GPT, 和ELMo之间的区别相关工作BERT的改进BERT 的详细实现输入/输出表示预训练BERT微调BERTBERT用在下游任务GLUE(一个自然语言任务集合)SQuAD v1.1(QA数据集)SQuAD v2.0SWAG消融实验预训练任务的影响模型大小的影响基于特征的BERT方法结论BERT简…

js对象和原型、原型链的关系

JS的原型、原型链一直是比较难理解的内容,不少初学者甚至有一定经验的老鸟都不一定能完全说清楚,更多的"很可能"是一知半解,而这部分内容又是JS的核心内容,想要技术进阶的话肯定不能对这个概念一知半解,碰到…

[附源码]计算机毕业设计JAVA大学生足球预约信息

[附源码]计算机毕业设计JAVA大学生足球预约信息 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM myba…

【JavaWeb】HTML学习完整篇

推荐学习专栏:JavaWeb学习专栏 目录1、HTML 语法规范(1)基本语法概述(2)标签关系2、HTML 基本结构标签3、 网页开发工具(1)使用方法(2)VSCode 工具生成骨架标签新增代码&…

Java项目——物业管理系统(附源码+数据库)

今天给小伙伴们分享一个Java项目——物业管理系统(附源码数据库) 感兴趣的小伙伴可以点击下方链接和小编一起学习哟~ https://www.bilibili.com/video/BV1cD4y1s73E/?spm_id_from333.999.0.0&vd_sourcea7816e3b2a3a67ac39dc87f6bf92421chttps://w…