继上篇
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 模块讲解(三)相关推荐

  1. 史上最全 Python Re 模块讲解(一)

    re模块下的函数 compile(pattern):创建模式对象 import repat=re.compile( A )m=pat.search( CBA ) #等价于 re.search( A , ...

  2. 史上最全 Python Re 模块讲解(二)

    继上文 https://blog.csdn.net/weixin_42625143/article/details/95329033 正则表达式 元字符 "." :通配符,除换行符 ...

  3. 深度梳理:史上最全 Python 字符串格式化讲解

    大家好,今天给大家分享一篇堪称史上最全对字符串格式化的文章.喜欢点赞.收藏.关注. 上个周末看到"pandas数据格式化处理"的时候,想着把(设置小数位数,设置百分位,设置千位分隔 ...

  4. 史上最全 Python 数据分析学习路线

    近年来,数据分析师的需求非常大,90%的岗位技能需要掌握Python作为数据分析工具. 今天,小编整理了2023年史上最全Python数据分析学习路线,从语言基础.数据工具.商业分析.到机器学习,一篇 ...

  5. python迭代器与生成器答案_史上最全 Python 迭代器与生成器

    原标题:史上最全 Python 迭代器与生成器 作者:浪子燕青 链接:http://www.langzi.fun/迭代器与生成器.html 迭代器与可迭代对象 概念 迭代器:是访问数据集合内元素的一种 ...

  6. python 列表生成器放while_史上最全 Python 迭代器与生成器

    原标题:史上最全 Python 迭代器与生成器 转自:浪子燕青 http://www.langzi.fun/迭代器与生成器.html 概念 迭代器:是访问数据集合内元素的一种方式,一般用来遍历数据,但 ...

  7. 史上最全Python学习笔记(基于《Python学习手册(第4版)》)——Part7 异常和工具

    文章目录 Chap32 异常基础 为什么使用异常 异常的角色 异常处理:简明扼要 默认异常处理器 捕获异常 引发异常 用户定义的异常 终止行为 Chap33 异常编码细节 try/except/els ...

  8. 史上最全Python入门基础教程(非常详细)

    Python 是一门开源免费.通用型的脚本编程语言,它上手简单,功能强大,坚持「极简主义」. Python 类库(模块)极其丰富,这使得 Python 几乎无所不能,不管是传统的 Web 开发.PC ...

  9. 【Python教程】史上最全Python快速入门教程,满满都是干货

    Python是面向对象,高级语言,解释,动态和多用途编程语言.Python易于学习,而且功能强大,功能多样的脚本语言使其对应用程序开发具有吸引力. Python的语法和动态类型具有其解释性质,使其成为 ...

最新文章

  1. Python 爬虫修养-处理动态网页
  2. python学起来难不难-新手学python数据分析难不难?
  3. Writing a Tile Engine in JavaFX
  4. python中while语句的用法_python 使用while循环输出*组成的菱形实例
  5. STL9-vector容器
  6. Myeclipse学习总结(15)——Eclipse/MyEclipse中Maven项目常见问题解决汇总
  7. TiKV 正式从 CNCF 毕业,成为云原生时代构建分布式系统的基石
  8. html表格内容自动更新,ElementUI table 组件展开 expand,动态更新数据时,视图没有自动更新...
  9. 自学python顺序-python数据结构学习之实现线性表的顺序
  10. Matplotlib库-Python数据可视化
  11. 有钱人也开始消费降级了!
  12. Synchronized的底层实现原理(看这篇就够了)
  13. 令人耳目一新的20款英文手写字体盘点
  14. Error: Delta RPMs disabled because /usr/bin/applyd
  15. mysqldump: Got error: 145:
  16. 工作杂谈:由IT行业技术变革 谈当今技术趋势
  17. Java 安全编程详解
  18. python里ipo是什么意思呢_IPO 指的是什么?公开募股和所谓的上市之间有什么区别?...
  19. 怎么配置java环境
  20. 2012中国情爱报告

热门文章

  1. 【Java报错】多数据源mapper异常more than one `primary` bean found among candidates: [sqlSessionFactory] 问题分析解决
  2. 解决springboot配置jackson.date-format不生效的问题
  3. adc采样时间_ADC采样原理
  4. JAVA——Java操作MySQL数据库的简单工具类[CLASS:DatabaseUtil]
  5. Ehab Fails to Be Thanos
  6. zookeeper分布式锁代码实例
  7. 【springboot中使用aop的具体步骤和示例】
  8. 【项目实战】vue+springboot项目使用富文本编辑器实现长文章发表和展示
  9. MySQL数据库-笔记05【查询练习题*25道(附解析)】
  10. Vue.js-Day09【项目实战(附带 完整项目源码)-day04:用户个人中心页面、用户登录页面、将项目打包部署到服务器上、项目汇报、实训心得】