7.17正则表达式与re模块
正则表达式
这里介绍的只是正则的一点点皮毛,如果要详细了解可以看书《正则指引》
1.re模块与正则表达式之间的关系
(1)正则表达式不是python独有的,它是一门独立的技术
(2)所有的编程语言都可以使用正则
(3)但是如果你想在python中使用,你就必须依赖于re模块
2.正则的作用
正则就是用来筛选字符串中的特定的内容的
3.正则的应用场景
(1)爬虫
(2)数据分析
只要是reg...一般情况下都是跟正则有关
4.正则表达式在线测试工具:http://tool.chinaz.com/regex/
5.如果想匹配具体的内容
那么可以直接写完整的内容,不需要写正则
6.字符组:[ ]
在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[ ]表示,字符分为很多类,比如数字、字母、标点等等,一个字符组里面的表达式都是或的关系
如果我们现在要求一个位置只能出现一个数字,那么这个位置上的字符只能是0、1、2...9这10个数中的一个,那怎么用正则表达式写呢
7.字符
以上每个正则字符只针对单个字符
(1)^与$符连用的情况
例如:^francis$
会精准限制匹配的内容,两者中间写什么,匹配的字符串就必须是什么,多一个也不行少一个也不行
(2)abc|ab的情况
一定要将长的放在前面,匹配规则是如果|前面的匹配上了,|后面的就被舍弃了,所以一定要将长的放在前面
(3)\w,\s,\d与\W,\S,\D相反的匹配关系(对应的两者结合就是匹配全局)
[\w\W]、[\s\S]、[\d\D]
(4)\b匹配一个单词的结尾
n\b:要写上单词以什么结尾(此处表示单词以n结尾),否则无法匹配
(5)^a、[^a]、[^a-z]
^a:如果^直接写在外面,是限制字符串的开头,判断以什么开头
[^a]:如果写在里面,表示除了[ ]内写的字符,其他都要(取反)
(6)分组
当多个正则符号需要重复多次的时候,或者当做一个整体进行其他操作,那么可以写成分组的形式,分组在正则的语法中就是()
([a-z][0-9])*
8.量词
(1)正则在匹配的时候默认都是贪婪匹配(尽量匹配多的)
你可以通过在量词后面加上一个?,就可以将贪婪匹配变成非贪婪匹配(惰性匹配)
\d*、\d+、\d?默认是贪婪匹配的
\d*?、\d+?、\d??修改为多惰性匹配
(2){n}:明确指定个数
\d{2}
(3)量词必须跟在正则符号的后面
量词只能够限制紧挨着它的那一个正则符号
\s\d* 这里的量词*只对\d有效
9.转义符
(1)在正则表达式中,有很多有特殊意义的是元字符,比如\n和\s等,如果要在正则中匹配正常的"\n"而不是"换行符"就需要对"\"进行转义,变成"\\"
(2)在python中,无论是正则表达式,还是待匹配的内容,都是以字符串的形式出现的,在字符串中\也有特殊的含义,本身还需要转义
(3)简便操作,利用r可以让整个字符串都不再转义(了解:r其实就是real的意思,真实不转义)
10.贪婪匹配与非贪婪匹配
(1)<.*>:先拿着里面的.*去匹配所有的内容,然后再根据>往回退着找,遇到>即停止
(2)<.*?>:先拿着?后面的>去匹配符合条件的最少的内容,然后把匹配的结果返回
举例:.*?x
就是取前面任意长度的字符,直到第一个x出现
re模块
1.三个必须掌握的方法
(1)findall
import re ret = re.findall('a', 'eva egon yuan') # 第一个参数是正则表达式,第二个参数是待匹配的文本内容 print(ret) # 返回所有满足匹配条件的结果,并且返回的是一个列表,列表中的元素就是正则匹配到的结果
(2)search
import re ret = re.search('a', 'eva egon yuan') print(ret) # search不会给你直接返回匹配到的结果,而是给你返回一个对象 print(ret.group()) # 必须调用group才能看到匹配到的结果 # 如果字符串没有匹配,则返回None,并且需要注意的是如果ret是None,再调用.group()会直接报错 if ret: # 可以通过if判断来进行筛选print(ret.group())
注意:
search只会依据正则查一次,只要查到了结果,就不会再往后查找
当查找的结果不存在的情况下,调用group直接报错
(3)match
import re ret = re.match('a', 'abc') # 同search,不过仅在字符串开始处进行匹配 print(ret) # match不会给你直接返回匹配到的结果,而是给你返回一个对象 print(ret.group()) # 必须调用group才能看到匹配到的结果 # match是从头开始匹配,如果正则规则从头开始可以匹配上,就返回一个对象,需要用group才能显示 if ret: # 如果没匹配上就返回None,调用group()就会报错,可以通过if判断来进行筛选print(ret.group())
注意:
match只会匹配字符串的开头部分
当字符串的开头不符合匹配规则的情况下,返回的也是None,调用group也会报错
2.其他方法
(1)split
import re ret = re.split('[ab]', 'abcd') # 先按'a'分割得到''和'bcd',在对''和'bcd'分别按'b'分割 print(ret) # ['', '', 'cd'] 返回的还是列表
(2)sub
import re ret = re.sub('\d', 'H', 'eva3egon4yuan4',1) # 将数字替换成'H',参数1表示只替换1个,不写默认全替换 # sub('正则表达式','新的内容','待替换的字符串',n) # 先按照正则表达式查找所有符合该表达式的内容,统一替换成'新的内容',还可以通过传参来控制替换的个数 print(ret) # evaHegon4yuan4
(3)subn
import re ret = re.subn('\d', 'H', 'eva3egon4yuan4') # 将数字替换成'H',返回元组(替换的结果,替换了多少次) ret1 = re.subn('\d', 'H', 'eva3egon4yuan4',1) # 将数字替换成'H',还可以通过传参来控制替换的个数,返回元组(替换的结果,替换了多少次) print(ret) # 返回的是一个元组 元组的第二个元素代表的是替换的个数
(4)compile
import re obj = re.compile('\d{3}') # 将正则表达式编译成为一个正则表达式对象,规则要匹配的是3个数字 ret = obj.search('abc123eeee') # 正则表达式对象调用search,参数为待匹配的字符串 res1 = obj.findall('347982734729349827384') print(ret.group()) # 结果 : 123 print(res1) # 结果 : ['347', '982', '734', '729', '349', '827', '384']
(5)finditer
import re ret = re.finditer('\d', 'ds3sy4784a') # finditer返回一个存放匹配结果的迭代器 print(ret) # <callable_iterator object at 0x10195f940> print(next(ret).group()) # 查看第一个结果,等价于ret.__next__().group() print(next(ret).group()) # 查看第二个结果,等价于ret.__next__().group() print([i.group() for i in ret]) # 查看剩余的匹配结果
3.findall的优先级查询:分组优先机制
import re res = re.search('^[1-9](\d{14})(\d{2}[0-9x])?$','110105199812067023') print(res.group()) print(res.group(1)) # 获取正则表达式括号阔起来分组的内容 print(res.group(2)) # search与match均支持获取分组内容的操作,这个功能跟正则无关是python的机制 # 而针对findall它没有group取值的方法,所以它默认就是分组优先获取的结果 ret = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com') print(ret) # 结果:['oldboy'] # 这是因为findall会优先把匹配结果组里的内容返回,如果想要匹配结果,取消权限即可 ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com') # ?:取消分组优先 print(ret) # ['www.oldboy.com']
4.给某一个正则表达式起别名:?<name>
import re ret = re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>hello</h1>") # 还可以在分组中利用?<name>的形式给分组起名字 # 获取的匹配结果可以直接用group('名字')拿到对应的值 print(ret.group('tag_name')) # 获取的匹配结果可以直接用group('名字')拿到对应的值,结果:h1 print(ret.group()) # 结果:<h1>hello</h1>
注意:
?P=tag_name相当于引用之前正则表达式,并且匹配到的值必须和前面的正则表达式一模一样
5.split的优先级查询:分组优先机制
import re ret=re.split("\d+","eva3egon4yuan") print(ret) #结果 : ['eva', 'egon', 'yuan'] ret1=re.split("(\d+)","eva3egon4yuan") print(ret1) #结果 : ['eva', '3', 'egon', '4', 'yuan'] # 会把切除的内容保存下来
转载于:https://www.cnblogs.com/francis1/p/11203877.html
7.17正则表达式与re模块相关推荐
- 7.17 正则表达式 re模块
在介绍正则表达式和re模块之前,先简要介绍一下 正则表达式与re模块的关系 1.正则表达式是一门独立的技术,任何语言均可使用 2.python中要想使用正则表达式需要通过re模块 正则表达式 元字符 ...
- python正则表达式之re模块方法介绍
python正则表达式之re模块其他方法 1:search(pattern,string,flags=0) 在一个字符串中查找匹配 2:findall(pattern,string,flags=0) ...
- python基础—正则表达式即re模块
正则表达式(regular expression),就是字符匹配模式,而这个匹配规则在我们写爬虫进行数据提取,或者进行数据可视化进行数据清洗时经常用到,多样化的匹配规则在复杂的字符的情况提取数据时助我 ...
- python re正则_正则表达式+Python re模块详解
正则表达式(Regluar Expressions)又称规则表达式,在代码中常简写为REs,regexes或regexp(regex patterns).它本质上是一个小巧的.高度专用的编程语言. 通 ...
- Python正则表达式和re模块,完美匹配中文与中文标点符号
正则表达式和re模块 世界上分两种人,一种是懂正则表达式的,一种是不懂正则表达式的. https://darlewo.cn/getting_started_with_crawler_advanced_ ...
- 正则表达式与re模块
一 .正则表达式与re模块的关系 正则表达式(regular expression)是对字符串数据的处理 re是python中的一个模块 1.正则模式是一门独立的技术,大多编程语言都支持使用 2.Py ...
- 便利贴--17{移动端滑动模块}
便利贴--17{移动端滑动模块} id id 动态绑定高度 <div id="mobileActivity" :style="{ height: height + ...
- Java学习-17 正则表达式简述
Java学习-17 正则表达式 1.什么是正则表达式? 正则表达式是构成搜索模式(search pattern)的字符序列. 当您搜索文本中的数据时,您可使用搜索模式来描述您搜索的内容. 正则表达式可 ...
- Python爬虫学习笔记-第六课(正则表达式下+csv模块的使用)
正则表达式下+csv模块的使用 1. re模块方法补充 1.1 compile()方法 1.2 search()和findall()方法 1.3 split()方法 1.4 sub()方法 2. re ...
最新文章
- Python 读取文本时的 read/readline/readlines
- Vue给Element UI的el-popconfirm绑定按钮事件
- springMVC参数传递(三)
- 【IOC 控制反转】Android 视图依赖注入 ( 视图依赖注入步骤 | 视图依赖注入代码示例 )
- Android简单调用相机Camera功能,实现打开照相功能
- JAVA中的那些名词解释
- 机器学习实战 k-近邻算法 手写识别系统
- java怎么定义范围_java – Dagger自定义范围,怎么办?
- matlab有限元分析与应用_专栏 | UEL用户子程序开发步骤—有限元理论基础及Abaqus内部实现方式研究系列20...
- 《深度学习笔记》——在训练过程中出现nan的调试笔记
- main函数默认参数argc和argv的详解
- 深度学习笔记_基本概念_Depthwise卷积与Pointwise卷积
- 四、Linux常用命令——文件搜索命令
- ArcGIS 拓扑验证与编辑共享要素
- (四)机器学习方法的分类
- MYSQL(mysqld --initialize --console初始化的时候报错:Can‘t create directory ‘C:\web\mysql-8.0.11\data\‘)
- 混沌工程是什么_平静中的混沌:什么是混沌工程?
- 从数据结构及汇编角度深入学习go语言
- 经典游戏----飞机大战
- Microsoft Edge (92.0.902.55 ) 打印(window.print) 卡死/无响应
热门文章
- wifipumpkin3启动报No such file or directory: b‘liblibc.a‘
- 正规的伦敦金投资平台排行榜(top 10)
- 码绘:使用p5.js进行简单的作画
- GPT格式的磁盘扩容
- 高德地图的测距api应用记录
- 中国自动浓咖啡机市场趋势报告、技术动态创新及市场预测
- 运用Python完成学生成绩判定
- EXCEL表格单元格中有数字和文字怎么将数字部分提取出来
- python中用函数编写程序_python编写程序,在程序中定义一个函数,计算1+1/2+1/3+1/4+……+1/n...
- 好佳居窗帘十大品牌 窗帘的发展故事