Python正则表达式详解,保姆式教学,0基础也能掌握正则

news2025/2/24 7:38:17

正则作为处理字符串的一个实用工具,在Python中经常会用到,比如爬虫爬取数据时常用正则来检索字符串等等。正则表达式已经内嵌在Python中,通过导入re模块就可以使用,作为刚学Python的新手大多数都听说”正则“这个术语。

今天来给大家分享一份关于比较详细的Python正则表达式宝典,学会之后你将对正则表达式达到精通的状态。

在这里插入图片描述

文章目录

    • 一、re模块
    • 二、正则表达式
      • (一)字符串的匹配
        • 1.普通字符
        • 2.元字符
    • (二)正则的使用
        • 1.编译正则
        • 2.正则对象的使用方法
        • 3.Match object 的操作方法
        • 4.re模块的函数
    • 三、结语


一、re模块

在讲正则表达式之前,我们首先得知道哪里用得到正则表达式。正则表达式是用在findall()方法当中,大多数的字符串检索都可以通过findall()来完成。

1.导入re模块
在使用正则表达式之前,需要导入re模块。

import re	

2.findall()的语法:

导入了re模块之后就可以使用findall()方法了,那么我们必须要清楚findall()的语法是怎么规定的。

findall(正则表达式,目标字符串)

不难看出findall()的是由正则表达式和目标字符串组成,目标字符串就是你要检索的东西,那么如何检索则是通过正则表达式来进行操作,也就是我们今天的重点。

使用findall()之后返回的结果是一个列表,列表中是符合正则要求的字符串


二、正则表达式

(一)字符串的匹配

1.普通字符

大多数的字母和字符都可以进行自身匹配。

import re
a = "abc123+-*"
b = re.findall('abc',a)
print(b)

输出结果:

['abc']

2.元字符

元字符指的是. ^ $ ? + {} \ []之类的特殊字符,通过它们我们可以对目标字符串进行个性化检索,返回我们要的结果。

这里我给大家介绍10个常用的元字符以及它们的用法,这里我先给大家做1个简单的汇总,便于记忆,下面会挨个讲解每一个元字符的使用。

在这里插入图片描述

(1) []

[] 的使用方式主要有以下三种:

  • 常用来指定一个字符集。
s = "a123456b"
rule = "a[0-9][1-6][1-6][1-6][1-6][1-6]b"	#这里暂时先用这种麻烦点的方法,后面有更容易的,不用敲这么多[1-6]
l = re.findall(rule,s)
print(l)

输出结果为:

['a123456b']
  • 可以表示一个范围。

例如要在字符串"abcabcaccaac"中选出abc元素:

s = "abcabcaccaac"
rule = "a[a,b,c]c"  # rule = "a[a-z0-9][a-z0-9][a-z0-9][a-z0-9]c"	
l = re.findall(rule, s)
print(l)

输出结果为:

['abc', 'abc', 'acc', 'aac']
  • [] 内的元字符不起作用,只表示普通字符。

例如要在字符串“caabcabcaabc”中选出“caa”:

print(re.findall("caa[a,^]", "caa^bcabcaabc"))

输出结果为:

['caa^']

注意点:当在[]的第一个位置时,表示除了a以外的都进行匹配,例如把[]中的和a换一下位置:

print(re.findall("caa[^,a]", "caa^bcabcaabc")) 

输出:

['caa^', 'caab'] 

(2)^

^ 通常用来匹配行首,例如:

print(re.findall("^abca", "abcabcabc"))

输出结果:

['abca']

请添加图片描述

(3) $
$ 通常用来匹配行尾,例如:

print(re.findall("abc$", "accabcabc"))

输出结果:

['abc']

在这里插入图片描述

(4)\

​ 反斜杠后面可以加不同的字符表示不同的特殊含义,常见的有以下3种。

  • \d:匹配任何十进制数等价于[0-9]
print(re.findall("c\d\d\da", "abc123abc"))

输出结果为:

['c123a']

\可以转义成普通字符,例如:

print(re.findall("\^abc", "^abc^abc"))

输出结果:

['^abc', '^abc']
  • s

匹配任何的空白字符例如:

print(re.findall("\s\s", "a     c"))

输出结果:

['  ', '  ']
  • \w

匹配任何字母数字和下划线,等价于[a-zA-Z0-9_],例如:

print(re.findall("\w\w\w", "abc12_"))

输出:

['abc', '12_']

在这里插入图片描述

(5){n}

{n}可以避免重复写,比如前面我们用\w时写了3次\w,而这里我们这需要用用上{n}就可以,n表示匹配的次数,例如:

print(re.findall("\w{2}", "abc12_"))

输出结果:

['ab', 'c1', '2_']

(6)*

*表示匹配零次或多次(尽可能的多去匹配),例如:

print(re.findall("010-\d*", "010-123456789"))

输出:

['010-123456789']

**(7) + **

+表示匹配一次或多次,例如

print(re.findall("010-\d+", "010-123456789"))

输出:

['010-123456789']

(8) .

.是个点,这里不是很明显,它用来操作除了换行符以外的任何字符,例如:

print(re.findall(".", "010\n?!"))

输出:

['0', '1', '0', '?', '!']

(9) ?

?表示匹配一次或零次

print(re.findall("010-\d?", "010-123456789"))

输出:

['010-1']

这里要注意一下贪婪模式和非贪婪模式。

贪婪模式:尽可能多的去匹配数据,表现为\d后面加某个元字符,例如\d*:

print(re.findall("010-\d*", "010-123456789"))

输出:

['010-123456789']

非贪婪模式:尽可能少的去匹配数据,表现为\d后面加?,例如\d?

print(re.findall("010-\d*?", "010-123456789"))

输出为:

['010-']

(10){m,n}
m,n指的是十进制数,表示最少重复m次,最多重复n次,例如:

print(re.findall("010-\d{3,5}", "010-123456789"))

输出:

['010-12345']

加上?表示尽可能少的去匹配

print(re.findall("010-\d{3,5}?", "010-123456789"))

输出:

['010-123']

{m,n}还有其他的一些灵活的写法,比如:

  • {1,} 相当于前面提过的 + 的效果
  • {0,1} 相当于前面提过的 ? 的效果
  • {0,} 相当于前面提过的 * 的效果

在这里插入图片描述

关于常用的元字符以及使用方法就先到这里,我们再来看看正则的其他知识。


(二)正则的使用

1.编译正则

在Python中,re模块可通过compile() 方法来编译正则,re.compile(正则表达式),例如:

 s = "010-123456789"
 rule = "010-\d*"
 rule_compile = re.compile(rule) #返回一个对象
 # print(rule_compile)
 s_compile = rule_compile.findall(s)
 print(s_compile)	#打印compile()返回的对象是什么

输出结果:

['010-123456789']

2.正则对象的使用方法

正则对象的使用方法不仅仅是通过我们前面所介绍的 findall() 来使用,还可以通过其他的方法进行使用,效果是不一样的,这里我做个简单的总结:

(1)findall()
找到re匹配的所有字符串,返回一个列表

(2)search()
扫描字符串,找到这个re匹配的位置(仅仅是第一个查到的)

(3)match()
决定re是否在字符串刚开始的位置(匹配行首)

就拿上面的 compile()编译正则之后返回的对象来做举例,我们这里不用 findall() ,用 match() 来看一下结果如何:

s = "010-123456789"
rule = "010-\d*"
rule_compile = re.compile(rule)  # 返回一个对象
# print(rule_compile)
s_compile = rule_compile.match(s)
print(s_compile)  # 打印compile()返回的对象是什么

输出:

<re.Match object; span=(0, 13), match='010-123456789'>

可以看出结果是1个match 对象,开始下标位置为0~13,match为 010-123456789 。既然返回的是对象,那么接下来我们来讲讲这个match 对象的一些操作方法。

在这里插入图片描述


3.Match object 的操作方法

这里先介绍一下方法,后面我再举例,Match对象常见的使用方法有以下几个:

(1)group()
返回re匹配的字符串

(2)start()
返回匹配开始的位置

(3)end()
返回匹配结束的位置

(4)span()
返回一个元组:(开始,结束)的位置

举例:用span()来对search()返回的对象进行操作:

s = "010-123456789"
rule = "010-\d*"
rule_compile = re.compile(rule)  # 返回一个对象
s_compile = rule_compile.match(s)
print(s_compile.span())  #用span()处理返回的对象

结果为:

(0, 13)

4.re模块的函数

re模块中除了上面介绍的findall()函数之外,还有其他的函数,来做一个介绍:

(1)findall()
根据正则表达式返回匹配到的所有字符串,这个我就不多说了,前面都是在介绍它。

(2)sub(正则,新字符串,原字符串)
sub() 函数的功能是替换字符串,例如:

s = "abcabcacc" #原字符串
l = re.sub("abc","ddd",s)   #通过sub()处理过的字符串
print(l)

输出:

ddddddacc	#把abc全部替换成ddd

(3)subn(正则,新字符串,原字符串)
subn()的作用是替换字符串,并返回替换的次数

s = "abcabcacc" #原字符串
l = re.subn("abc","ddd",s)   #通过sub()处理过的字符串
print(l)

输出:

('ddddddacc', 2)

(4)split()
split()分割字符串,例如:

s = "abcabcacc"
l = re.split("b",s)
print(l)

输出结果:

['a', 'ca', 'cacc']

在这里插入图片描述


三、结语

关于正则,我就讲这么多了,正则几乎是Python所有方向中是必不可少的一个基础,祝你的Python之旅学有所成!

感谢你们的阅读和喜欢,我收藏了很多技术干货,可以共享给喜欢我文章的朋友们,如果你肯花时间沉下心去学习,它们一定能帮到你,干货内容包括:

在这里插入图片描述

点击文末的名片可以抱走
在这里插入图片描述

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

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

相关文章

学生成绩管理系统【纯控制台】(Java课设)

系统类型 纯控制台类型&#xff08;没有用到数据库&#xff09; 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Idea或eclipse 运行效果 本系统源码地址&#xff1a;https://download.csdn.net/download/qq_50954361/87753365 更多系统…

Python每日一练(20230505) 课程表 Course Schedule III/IV

目录 3. 课程表 Course Schedule III 4. 课程表 Course Schedule IV &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 3. 课程表 Course Schedule III 这里有 n 门不同的在线课程&#xff…

python并发编程:什么是并发编程?python对并发编程有哪些支持?

Python并发编程是指同时执行多个任务的编程模式。Python提供了多种实现并发编程的方式&#xff0c;包括多线程、多进程、协程、异步IO等。 为什么要引入并发编程 假设以下两个场景&#xff1a; 场景一: 一个网络爬虫&#xff0c;按顺序爬取花了一个小时&#xff0c;采用并发…

距新发牌制度生效不到1个月,我们和数位香港Web3er聊了聊

出品&#xff5c;欧科云链研究院 作者&#xff5c;Jason Jiang 4月20日&#xff0c;欧洲议会通过加密资产市场法规&#xff08;MiCA&#xff09;,使欧盟成为全球首个引入全面加密法的主要司法管辖区。与此同时&#xff0c;东方世界的香港也正加速拥抱Web3变革。香港特区立法会…

【线程安全】内存可见性问题及解决方案

1. 关于内存可见性的一段代码 import java.util.Scanner; public class ThreadDemo {public static int count 0;public static void main(String[] args) throws InterruptedException {Thread t1 new Thread(() -> {while (count 0) {}System.out.println("t1 线程…

双向链表及双向链表的常见操作和用js封装一个双向链表

书接上回&#xff0c;上一篇文章讲了单向链表以及用 js 封装一个单向链表&#xff0c;所以这节将介绍双向链表以及用 js 封装一个双向链表。待会我也会继续在文章后面附上视频学习链接地址&#xff0c;大家想学习的可以去看看 一、认识双向链表 首先来认识一下什么是双向链表&…

广和通发布5G智能模组SC151系列,助力AIoT应用更智能高效

2023年5月&#xff0c;广和通发布5G R16智能模组SC151系列。SC151系列基于4nm制程工艺的高通QCM4490解决方案设计&#xff0c;采用8核高性能处理器&#xff0c;为工业与商业物联网终端提供高性能处理能力。面对与日俱增的终端智能化需求&#xff0c;SC151系列将助力打造高生产力…

【致敬未来的攻城狮计划】第2期定向赠书《RT-Thread设备驱动开发指南》+ 《GD32 MCU原理及固件库开发指南》

开启攻城狮的成长之旅&#xff01;这是我参与的由 CSDN博客专家 架构师李肯&#xff08;超链接&#xff1a;http://yyds.recan-li.cn&#xff09;和 瑞萨MCU &#xff08;超链接&#xff1a;瑞萨电子 (Renesas Electronics Corporation)&#xff09; 联合发起的「 致敬未来的攻…

【LeetCode】每日一题:移除链表元素 [C语言实现]

&#x1f47b;内容专栏&#xff1a;《LeetCode刷题专栏》 &#x1f428;本文概括&#xff1a;203.移除链表元素 &#x1f43c;本文作者&#xff1a;花 碟 &#x1f438;发布时间&#xff1a;2023.5.5 203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff…

微信小程序的生命周期

微信小程序的生命周期 1.什么是生命周期&#xff1f;2.生命周期的分类3.什么是生命周期函数&#xff1f;4.生命周期函数的分类5.应用生命周期函数6.页面周期函数 1.什么是生命周期&#xff1f; 生命周期&#xff08;Life Cycle&#xff09;是指一个对象从创建 -> 运行 ->…

Ant Design Pro---【02 UMI路由讲解】

在 Umi 中&#xff0c;应用都是单页应用&#xff0c;页面地址的跳转都是在浏览器端完成的&#xff0c;不会重新请求服务端获取 html&#xff0c;html 只在应用初始化时加载一次。所有页面由不同的组件构成&#xff0c;页面的切换其实就是不同组件的切换&#xff0c;你只需要在配…

设计模式——观察者模式(应用广,较难)

是什么&#xff1f; 又被称为发布-订阅模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者同时监听某一个主题对象&#xff0c;这个主题对象在状态变化时&#xff0c;会通知所有的观察者对象&#xff0c;使它们能够更新自己&#xff1b; 结构 抽象主题&…

复兴号列车司机室

复兴号上线有一段时间了&#xff0c;很多旅客都已经体验过&#xff0c;但是&#xff0c;司机室可能绝大多数人都没有机会一睹容颜&#xff0c;今天带你去司机室操纵台去探索一番。 按照上图的圈圈划分为操作台右侧&#xff08;蓝色圈圈&#xff09;、中部&#xff08;红色圈圈…

从C到C++

目录 1、输入输出库与名字空间 2、输入输出流对象cin和cout 3、string字符串类 4、bool类型 5、自增自减--运算符&#xff08;必考&#xff09; 6、其他 1、输入输出库与名字空间 #include <iostream> using namespace std; 每次写代码先把这两个东西加上 <io…

共享内存实现进程间大数据的交换

引言   进程间的数据交换和共享是一种非常重要和实用的技术。大、中型软件的开发设计多是由众多程序设计人员的合作完成&#xff0c;通常一个程序设计人员只负责其中一个或几个模块的开发&#xff0c;这些模块可以是动态链接库也可以是应用程序或是其他形式的程序组件。这些独…

Java 面试必问的线程池原理总结

本文首发自「慕课网」&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"&#xff01; 作者&#xff1a;大能老师 | 慕课网讲师 Java 线程池原理总结 &#xff08;一&#xff09;什么是线程池 线程池做的工作主要是控制运行…

Arcgis进阶篇(4)——arcgis js api使用geoserver服务

1、geoserver安装方法 geoserver-2.19.x&#xff08;此版本支持jdk8.x&#xff09;的下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1PkmmjHWWzbUA9fYfa110Ew?pwd8tvf 提取码&#xff1a;8tvf 经测试&#xff0c;最新版本的geoserver需要jdk11&#xff…

elasticsearch 使用的基础工具包及配置安装信息

前言:elasticsearch 工具在查询大量数据上面有明显的优势&#xff0c;但是具体的使用门槛相对较高&#xff0c;具体使用中不同版本使用上还有些差别&#xff0c;需要匹配上 spring boot elasticsearch 版本才能少出错 使用到的工具包&#xff0c;注意具体的版本 elasticsearc…

坚持伙伴优先,共创数据存储新生态

4 月 26 日&#xff0c;2023 阿里云合作伙伴大会上&#xff0c;阿里巴巴集团董事会主席兼 CEO、阿里云智能集团 CEO 张勇表示&#xff0c;阿里云的核心定位是一家云计算产品公司&#xff0c;生态是阿里云的根基。让被集成说到做到的核心&#xff0c;是要坚定走向“产品被集成”…

linux0.12-8-4-sys_call.s

[301页] 8-4 sys_call.s 程序 sys_call.s 程序简单总结&#xff1a; int 0x80 – _system_call int16 – 处理器错误中断 int7 – 设备不存在或协处理器不存在。 int32 – (int 0x20)时钟中断处理程序。 两个系统功能的底层接口&#xff0c;分别是 sys_execve 和 sys_fork 。…