史上最全 Python Re 模块讲解(三)
继上篇
https://blog.csdn.net/weixin_42625143/article/details/95330557
“{m}” :匹配字符串出现m次
>>> pat = re.compile( [op]{2} ) #o或p出现2次
>>> pat.search( abcooapp ).group() #匹配第一次出现的字符串,o比p先出现
oo
>>> pat.findall( abcooapp ) #匹配出现的所有字符串,列表形式返回
[ oo , pp ]
“{m,n}” :匹配字符串出现m到n次
>>> pat = re.compile( [op]{2,4} ) #o或则p出现2到4次
>>> pat.match( pppabcooapp ).group() #匹配开头
ppp
>>> pat.search( pppabcooapp ).group() #匹配第一次出现
ppp
>>> pat.findall( pppabcooapp ) #匹配所有
[ ppp , oo , pp ]
.group() #匹配第一次出现
边界
“^” :匹配字符串开头或行头
>>> pat = re.compile( ^[abc] ) #开头是a、b、c中的任意一个
>>> pat.search( defabc ).group()
>>> pat.match( defabc ).group() #均找不到
>>> pat.findall( defabc )
[]>>> pat.search( adefabc ).group()
a
>>> pat.match( adefabc ).group() #开头是a、b、c中的任意一个
a
>>> pat.findall( adefabc )
[ a ]>>> pat = re.compile( ^[abc]+ ) #开头是a、b、c中的任意一个的一次或则多次,贪婪:匹配多个
>>> pat.findall( cbadefab )
[ cba ]
>>> pat = re.compile(r ^[abc]+? ) #开头是a、b、c中的任意一个的一次或则多次,非贪婪:匹配一个
>>> pat.findall( cbadefab )
[ c ]
“$” :匹配字符串结尾或则行尾
>>> pat = re.compile( [abc]$ )
>>> pat.match( adefAbc ).group() #match匹配的是字符串开头,所以查找$的时,总是返回None
>>> pat.search( adefAbc ).group() #结尾是a、b、c中的任意一个
c
>>> pat.findall( adefAbc )
[ c ]
>>> pat = re.compile( [abc]+$ )
>>> pat.search( adefAbc ).group() #结尾是a、b、c中的任意一个的一次或则多次,贪婪:匹配多个
bc
>>> pat.findall( adefAbc )
[ bc ]
“A”:匹配字符串开头
>>> pat = re.compile( A[abc]+ )
>>> pat.findall( cbadefab )
[ cba ]
>>> pat.search( cbadefab ).group()
cba
“Z”:匹配字符串结尾
>>> pat = re.compile( [abc]+Z )
>>> pat.search( cbadefab ).group()
ab
>>> pat.findall( cbadefab )
[ ab ]
分组
(…):分组匹配,从左到右,每遇到一个 ( 编号+1,分组后面可加数量词
>>> pat=re.compile(r (a)w(c) ) #w:单个的数字或字母 [A-Za-z0-9]
>>> pat.match( abcdef ).group()
abc
>>> pat=re.compile( (a)b(c) ) #分2组,匿名分组>>> pat.match( abcdef ).group() #默认返回匹配的字符串
abc
>>> pat.match( abcdef ).group(1) #取分组1,适用于search
a
>>> pat.match( abcdef ).group(2) #取分组2,适用于search
c
>>> pat.match( abcdef ).groups() #取所有分组,元组形式返回
( a , c )
:引用编号为的分组匹配到的字符串
>>> pat=re.compile(r www.(.*)..{3} )
>>> pat.match( www.dxy.com ).group(1)
dxy
“(?P…)” :在模式里面用()来表示分组(命名分组),适用于提取目标字符串中的某一些部位。
>>> pat=re.compile(r (?P<K>a)w(c) ) #分2组:命名分组+匿名分组
>>> pat.search( abcdef ).groups() #取所有分组,元组形式返回
( a , c )
>>> pat.search( abcdef ).group(1) #取分组1,适用于match
a
>>> pat.search( abcdef ).group(2) #取分组2,适用于match
c
>>> pat.search( abcdef ).group() #默认返回匹配的字符串
abc
>>> pat.search( abcdef ).groupdict() #命名分组可以返回一个字典【专有】,匿名分组也没有
{ K : a }
“(?P=name)”:引用别名为的分组匹配到的串
>>> pat=re.compile(r (?P<K>a)w(c)(?P=K) ) #(?P=K)引用分组1的值,就是a
>>> pat.search( abcdef ).group() #匹配不到,因为完整 awca ,模式的第4位是a
Traceback (most recent call last):File "<stdin>", line 1, in <module>
AttributeError: NoneType object has no attribute group>>> pat.search( abcadef ).group() #匹配到,模式的第4位和组1一样,值是c
abca
>>> pat.search( abcadef ).groups()
( a , c )
>>> pat.search( abcadef ).group(1)
a
>>> pat.search( abcadef ).group(2)
c
“” :引用分组编号匹配:
>>> pat=re.compile(r (?P<K>a)w(c)(?P=K) ) #引用分组2的值,就是c
>>> pat.findall( Aabcadef ) #匹配不到,因为完整 awcac ,模式的第5位是c
[]
>>> pat.findall( Aabcacdef ) #匹配到,模式的第5位和组2一样,值是c
[( a , c )]
>>> pat.search( Aabcacdef ).groups()
( a , c )
>>> pat.search( Aabcacdef ).group()
abcac
>>> pat.search( Aabcacdef ).group(1)
a
>>> pat.search( Aabcacdef ).group(2)
c
特殊构造
(?:…) (…)不分组版本,用于使用 | 或者后接数量词
(?iLmsux) iLmsux的每个字符代表一个匹配模式,只能用在正则表达式的开头,可选多个
(?#…) #号后的内容将作为注释
(?=…) 之后的字符串内容需要匹配表达式才能成功匹配
(?!…) 之后的字符串不匹配表达式才能成功
(?(?(?(id/name) yes |no) 如果编号为id/名字为name的组匹配到字符串,则需要匹配yes,否则匹配no,no可以省略
“(?:…)” :()里面有?:表示该()不是分组
>>> pat=re.compile(r a(?:bc) )
>>> pat.findall( abc )
[ abc ]
>>> pat.match( abc ).groups() #显示不出分组
“(?=…)”:匹配…表达式,返回。对后进行匹配,总是对后面进行匹配
>>> pat=re.compile(r w(?=d) ) #匹配表达式d,返回数字的前一位,w:单词字符[A-Za-z0-9]
>>> pat.findall( abc1 def1 xyz1 )
[ c , f , z ]
>>> pat.findall( zhoujy20130628hangzhou ) #匹配数字的前一位,列表返回
[ y , 2 , 0 , 1 , 3 , 0 , 6 , 2 ]
>>> pat=re.compile(r w+(?=d) )
>>> pat.findall( abc1,def1,xyz1 ) #匹配最末数字的前字符串,列表返回
[ abc , def , xyz ]
>>> pat.findall( abc21,def31,xyz41 )
[ abc2 , def3 , xyz4 ]
>>> pat.findall( zhoujy20130628hangzhou )
[ zhoujy2013062 ]
>>> pat=re.compile(r [A-Za-z]+(?=d) ) #[A-Za-z],匹配字母,可以用其他的正则方法
>>> pat.findall( zhoujy20130628hangzhou123 ) #匹配后面带有数字的字符串,列表返回
[ zhoujy , hangzhou ]
>>> pat.findall( abc21,def31,xyz41 )
[ abc , def , xyz ]
“(?!…)” 不匹配…表达式,返回。对后进行匹配
>>> pat=re.compile(r [A-Za-z]+(?!d) ) #[A-Za-z],匹配字母,可以用其他的正则方法
>>> pat.findall( zhoujy20130628hangzhou123,12,binjiang310 ) #匹配后面不是数字的字符串,列表返回
[ zhouj , hangzho , binjian ]
>>> pat.findall( abc21,def31,xyz41 )
[ ab , de , xy ]
“(?<=…)”:匹配…表达式,返回。对前进行匹配,总是对前面进行匹配
>>> pat=re.compile(r (?<=d)[A-Za-z]+ ) #匹配前面是数字的字母
>>> pat.findall( abc21,def31,xyz41 )
[]
>>> pat.findall( 1abc21,2def31,3xyz41 )
[ abc , def , xyz ]
>>> pat.findall( zhoujy20130628hangzhou123,12,binjiang310 )
[ hangzhou ]
“(?<!…)”:不匹配…表达式,返回。对前进行匹配,总是对前面进行匹配
>>> pat=re.compile(r (?<!d)[A-Za-z]+ ) #匹配前面不是数字的字母
>>> pat.findall( abc21,def31,xyz41 )
[ abc , def , xyz ]
>>> pat.findall( zhoujy20130628hangzhou123,12,binjiang310 )
[ zhoujy , angzhou , binjiang ]
“(?(id/name) yes |no)”: 组是否匹配,匹配返回
>>> pat=re.compile(r a(d)?bc(?(1)d) ) #no省略了,完整的是adbcd ==> a2bc3,总共5位,第2位是可有可无的数字,第5为是数字
>>> pat.findall( abc9 ) #返回组1,但第2位(组1)没有,即返回了
[ ]
>>> pat.findall( a8bc9 ) #完整的模式,返回组1
[ 8 ]
>>> pat.match( a8bc9 ).group()
a8bc9
>>> pat.match( a8bc9 ).group(1)
8
>>> pat.findall( a8bc ) #第5位不存在,则没有匹配到
[]
“(?iLmsux)”:这里就介绍下i参数:大小写区分匹配
>>> pat=re.compile(r abc )
>>> pat.findall( abc )
[ abc ]
>>> pat.findall( ABC )
[]
>>> pat=re.compile(r (?i)abc ) #(?i) 不区分大小写
>>> pat.findall( ABC )
[ ABC ]
>>> pat.findall( abc )
[ abc ]
>>> pat.findall( aBc )
[ aBc ]
>>> pat.findall( aBC )
[ aBC ]
>>> pat=re.compile(r abc ,re.I) #re.I 作为参数使用,推荐
>>> pat.findall( aBC )
[ aBC ]
>>> pat.findall( abc )
[ abc ]
>>> pat.findall( ABC )
[ ABC ]
史上最全 Python Re 模块讲解(三)相关推荐
- 史上最全 Python Re 模块讲解(一)
re模块下的函数 compile(pattern):创建模式对象 import repat=re.compile( A )m=pat.search( CBA ) #等价于 re.search( A , ...
- 史上最全 Python Re 模块讲解(二)
继上文 https://blog.csdn.net/weixin_42625143/article/details/95329033 正则表达式 元字符 "." :通配符,除换行符 ...
- 深度梳理:史上最全 Python 字符串格式化讲解
大家好,今天给大家分享一篇堪称史上最全对字符串格式化的文章.喜欢点赞.收藏.关注. 上个周末看到"pandas数据格式化处理"的时候,想着把(设置小数位数,设置百分位,设置千位分隔 ...
- 史上最全 Python 数据分析学习路线
近年来,数据分析师的需求非常大,90%的岗位技能需要掌握Python作为数据分析工具. 今天,小编整理了2023年史上最全Python数据分析学习路线,从语言基础.数据工具.商业分析.到机器学习,一篇 ...
- python迭代器与生成器答案_史上最全 Python 迭代器与生成器
原标题:史上最全 Python 迭代器与生成器 作者:浪子燕青 链接:http://www.langzi.fun/迭代器与生成器.html 迭代器与可迭代对象 概念 迭代器:是访问数据集合内元素的一种 ...
- python 列表生成器放while_史上最全 Python 迭代器与生成器
原标题:史上最全 Python 迭代器与生成器 转自:浪子燕青 http://www.langzi.fun/迭代器与生成器.html 概念 迭代器:是访问数据集合内元素的一种方式,一般用来遍历数据,但 ...
- 史上最全Python学习笔记(基于《Python学习手册(第4版)》)——Part7 异常和工具
文章目录 Chap32 异常基础 为什么使用异常 异常的角色 异常处理:简明扼要 默认异常处理器 捕获异常 引发异常 用户定义的异常 终止行为 Chap33 异常编码细节 try/except/els ...
- 史上最全Python入门基础教程(非常详细)
Python 是一门开源免费.通用型的脚本编程语言,它上手简单,功能强大,坚持「极简主义」. Python 类库(模块)极其丰富,这使得 Python 几乎无所不能,不管是传统的 Web 开发.PC ...
- 【Python教程】史上最全Python快速入门教程,满满都是干货
Python是面向对象,高级语言,解释,动态和多用途编程语言.Python易于学习,而且功能强大,功能多样的脚本语言使其对应用程序开发具有吸引力. Python的语法和动态类型具有其解释性质,使其成为 ...
最新文章
- Python 爬虫修养-处理动态网页
- python学起来难不难-新手学python数据分析难不难?
- Writing a Tile Engine in JavaFX
- python中while语句的用法_python 使用while循环输出*组成的菱形实例
- STL9-vector容器
- Myeclipse学习总结(15)——Eclipse/MyEclipse中Maven项目常见问题解决汇总
- TiKV 正式从 CNCF 毕业,成为云原生时代构建分布式系统的基石
- html表格内容自动更新,ElementUI table 组件展开 expand,动态更新数据时,视图没有自动更新...
- 自学python顺序-python数据结构学习之实现线性表的顺序
- Matplotlib库-Python数据可视化
- 有钱人也开始消费降级了!
- Synchronized的底层实现原理(看这篇就够了)
- 令人耳目一新的20款英文手写字体盘点
- Error: Delta RPMs disabled because /usr/bin/applyd
- mysqldump: Got error: 145:
- 工作杂谈:由IT行业技术变革 谈当今技术趋势
- Java 安全编程详解
- python里ipo是什么意思呢_IPO 指的是什么?公开募股和所谓的上市之间有什么区别?...
- 怎么配置java环境
- 2012中国情爱报告
热门文章
- 【Java报错】多数据源mapper异常more than one `primary` bean found among candidates: [sqlSessionFactory] 问题分析解决
- 解决springboot配置jackson.date-format不生效的问题
- adc采样时间_ADC采样原理
- JAVA——Java操作MySQL数据库的简单工具类[CLASS:DatabaseUtil]
- Ehab Fails to Be Thanos
- zookeeper分布式锁代码实例
- 【springboot中使用aop的具体步骤和示例】
- 【项目实战】vue+springboot项目使用富文本编辑器实现长文章发表和展示
- MySQL数据库-笔记05【查询练习题*25道(附解析)】
- Vue.js-Day09【项目实战(附带 完整项目源码)-day04:用户个人中心页面、用户登录页面、将项目打包部署到服务器上、项目汇报、实训心得】