re模块(正则表达式)
时间:2022-05-07
本文章向大家介绍re模块(正则表达式),主要内容包括一、什么是正则表达式、二、正则表达式基础、元字符:、量词:、三、常见的正则表达式应用、四、python中如何使用正则表达式、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
一、什么是正则表达式
正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。或者说:正则就是用来描述一类事物的规则。(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。
二、正则表达式基础
字符组 : [字符组]
在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示 字符分为很多类,比如数字、字母、标点等等。
1 [1] 匹配1
2 [123] 匹配1、2、3
3 [0-9] 匹配任意一个数字
4 [a-z] 匹配任意一个小写字母
5 [A-Z] 匹配任意一个大写字母
6 [A-Za-z] 匹配任意一个字母
示例如下:
1 print(re.findall('[1]','Zll5201314')) #['1', '1']
2 print(re.findall('[123]','Zll5201314')) #['2', '1', '3', '1']
3 print(re.findall('[0-9]','Zll5201314')) #['5', '2', '0', '1', '3', '1', '4']
4 print(re.findall('[a-z]','Zll5201314')) #['l', 'l']
5 print(re.findall('[A-Z]','Zll5201314')) #['Z']
6 print(re.findall('[a-zA-Z]','Zll5201314')) #['Z', 'l', 'l']
7 print(re.findall('[A-Za-z0-3]','Zll5201314')) #['Z', 'l', 'l', '2', '0', '1', '3', '1']
元字符:
1 . 匹配除换行符以外的任意字符
2 w 匹配字母或者数字或者下划线
3 s 匹配任意空白字符
4 d 匹配数字
5 n 匹配换行符
6 t 匹配制表符tab
7 b 匹配一个单词的结尾
8 ^ 匹配字符串的开始
9 $ 匹配字符串的结尾
10 W 匹配非字母或下划线或数字
11 D 匹配非数字
12 S 匹配非空白符
13 | 匹配|前或者后的内容
14 () 匹配括号内的表达式,也表示一个组
示例如下:
1 print(re.findall('.','love_u 520')) #['l', 'o', 'v', 'e', '_', 'u', ' ', '5', '2', '0']
2 print(re.findall('w','love_u 520')) #['l', 'o', 'v', 'e', '_', 'u', '5', '2', '0']
3 print(re.findall('s','love_u 520')) #[' ']
4 print(re.findall('d','love_u 520')) #['5', '2', '0']
5 print(re.findall('n','love_u 520')) #[]
6 print(re.findall('b','love_u 520')) #[]
7 print(re.findall('^l','love_u 520')) #['l']
8 print(re.findall('520$','love_u 520'))#['520']
9 print(re.findall('W','love_u 520')) #[' ']
10 print(re.findall('D','love_u 520')) #['l', 'o', 'v', 'e', '_', 'u', ' ']
11 print(re.findall('S','love_u 520')) #['l', 'o', 'v', 'e', '_', 'u', '5', '2', '0']
12 print(re.findall('love|u','love_u 520')) #['love', 'u']
量词:
1 * 重复零次或者多次
2 + 重复1次或者多次
3 ? 重复零次或者一次
4 {n} 重复n次
5 {n,} 重复n次或者更多次
6 {n,m} 重复n到m次
示例如下:
1 print(re.findall('5*','555 5')) #['555', '', '5', '']
2 print(re.findall('5+','555 5')) #['555', '5']
3 print(re.findall('5?','555 5')) #['5', '5', '5', '', '5', '']
4 print(re.findall('5{2,3}','555 5')) #['555']
5 print(re.findall('5{2}','555 5')) #['55']
6 print(re.findall('5{3}','555 5')) #['555']
三、常见的正则表达式应用
1 手机号(国内):^[1-9][3478]d{9}
2 电话号(国内):[0-9-()()]{7,18}
3 邮编:d{6}
4 QQ:[1-9]([0-9]{5,11})
5 身份证号:d{17}[d|x]|d{15}
6 邮箱:w[-w.+]*@([A-Za-z0-9][-A-Za-z0-9]+.)+[A-Za-z]{2,14}
7 网址:^((https|http|ftp|rtsp|mms)?://)[^s]+
8 日期:d{4}(-|/|.)d{1,2}1d{1,2}
9 用户名:[A-Za-z0-9_-u4e00-u9fa5]+
#正则表达式在线测试网址“http://tool.chinaz.com/regex/”
四、python中如何使用正则表达式
findall()方法:
此方法是在整个字符串中匹配指定字符或者字符串,并且将所有满足条件的结果返回到一个列表中,如下:
1 ret = re.findall('a','abac')
2 print(ret) #['a', 'a']
3 ret = re.findall('ab','abac')
4 print(ret) #['ab']
search()方法:
此方法是在整个字符串中查找满足匹配条件的字符或者字符串,一旦找到一个就不再继续查找,并返回包含查找值的对象,可以用.group()方法进行查看,如下:
1 ret = re.search('a','abac')
2 print(ret.group()) #a
match()方法:
此方法是用来从开头位置查找是否满足匹配条件,如果没有就会返回None,如果有,则会返回一个包含查找值的对象,可以用group()方法进行查看,如下:
1 ret = re.match('a','abac')
2 print(ret.group()) #a
3
4 ret = re.match('b','abac')
5 print(ret) #None
split()方法:
此方法用来对一个字符串进行切分,如下:
1 ret = re.split('[ab]', 'abcd') # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割
2 print(ret) # ['', '', 'cd']
sub()以及subn()方法:
1 ret = re.sub('d', '*', 'a1b2c3')#将数字替换成'*',默认替换所有的数字
2 print(ret) #a*b*c*
3
4 ret = re.sub('d', '*', 'a1b2c3', 1)#将数字替换成'*',参数1表示只替换1个
5 print(ret) #a*b2c3
6
7 ret = re.subn('d', '*', 'a1b2c3')#将数字替换成'*',返回一个元祖(替换后的字符串,替换的次数)
8 print(ret) #('a*b*c*', 3)
compile()方法:
此方法是先把正则表达式编译好,以方便多次使用,如下:
1 obj = re.compile('d{3}') #将正则表达式编译成为一个 正则表达式对象,规则要匹配的是3个数字
2 ret = obj.search('abc123eeee') #正则表达式对象调用search,参数为待匹配的字符串
3 print(ret.group()) #结果 : 123
finditer()方法:
此方法与findall类似,只不过返回的不是一个列表,而是一个生产器,可以用next(iter).group()来查看里面的值,如下:
1 ret = re.finditer('d', 'ds3sy4784a') #finditer返回一个存放匹配结果的迭代器
2 print(ret) # <callable_iterator object at 0x10195f940>
3 print(next(ret).group()) #查看第一个结果
4 print(next(ret).group()) #查看第二个结果
5 print([i.group() for i in ret]) #查看剩余的左右结果
- BZOJ 3038: 上帝造题的七分钟2【线段树区间开方问题】
- BZOJ 3211: 花神游历各国【线段树区间开方问题】
- WP、Win10开发或者WPF开发时绘制自定义窗体~例如:一个手机
- 【Java学习笔记之八】JavaBean中布尔类型使用注意事项
- BZOJ 1597: [Usaco2008 Mar]土地购买【斜率优化+凸包维护】
- BZOJ 1046: [HAOI2007]上升序列【贪心+二分状态+dp+递归】
- 【Java学习笔记之九】java二维数组及其多维数组的内存应用拓展延伸
- BZOJ 1293: [SCOI2009]生日礼物【单调队列】
- Javascript缓存投毒学习与实战
- 【Java学习笔记之十】Java中循环语句foreach使用总结及foreach写法失效的问题
- Codeforces 839B Game of the Rows【贪心】
- Codeforces 839A Arya and Bran【暴力】
- 【Java学习笔记之十一】Java中常用的8大排序算法详解总结
- 浅谈zip格式处理逻辑漏洞
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- NBA球员投篮数据可视化。
- 「Workshop」第十九期:Markdown与RMarkdown最佳入口
- S1到S9,545名职业选手,有多少人折戟全球总决赛?
- 「R」数据可视化21: Edge Bunding图
- 一个服务器能干什么?
- 按照说明做了 ,还是没有点亮网关,一直离线模式
- iOS音视频接入-快速集成TRTC SDK
- 基于Flink快速开发实时TopN程序最简单的思路
- MySQL+Flask,在本地实现一个API接口。
- Java新特性:数据类型可以扔掉了?
- 使用Flask在服务器实现一个API接口。
- 深入理解谷歌最强V8垃圾回收机制
- 用Python下载抖音无水印视频!
- 多年管理系统开发经验总结~代码解决方案
- 分析B站100万+视频,发现竟然有这么多干货资源。