设为首页 收藏本站
查看: 743|回复: 0

[经验分享] Python正则表达式(四)

[复制链接]

尚未签到

发表于 2017-4-28 13:04:15 | 显示全部楼层 |阅读模式
  3 更深入的了解re的组与对象
  前面对Python正则式的组进行了一些简单的介绍,由于还没有介绍到match对象,而组又是和match对象密切相关的,所以必须将它们结合起来介绍才能充分地说明它们的用途。
  不过再详细介绍它们之前,我觉得有必要先介绍一下将规则编译后的生成的patter对象
  3.1编译后的Pattern对象
  将一个正则式,使用compile函数编译,不仅是为了提高匹配的速度,同时还能使用一些附加的功能。编译后的结果生成一个Pattern对象,这个对象里面有很多函数,他们看起来和re模块的函数非常象,它同样有findall , match , search ,finditer , sub , subn , split 这些函数,只不过它们的参数有些小小的不同。一般说来,re模块函数的第一个参数,即正则规则不再需要了,应为规则就包含在Pattern对象中了,编译选项也不再需要了,因为已经被编译过了。因此re模块中函数的这两个参数的位置,就被后面的参数取代了。
  findall , match , search 和finditer这几个函数的参数是一样的,除了少了规则和选项两个参数外,它们又加入了另外两个参数,它们是:查找开始位置和查找结束位置,也就是说,现在你可以指定查找的区间,除去你不感兴趣的区间。它们现在的参数形式是:
  findall ( targetString [, startPos [,endPos] ] )
  finditer ( targetString [, startPos [,endPos] ] )
  match ( targetString [, startPos [,endPos] ] )
  search ( targetString [, startPos [,endPos] ] )
  这些函数的使用和re模块的同名函数使用完全一样。所以就不多介绍了。
  除了和re模块的函数同样的函数外,Pattern对象还多了些东西,它们是:
  flags 查询编译时的选项
  pattern 查询编译时的规则
  groupindex 规则里的组
  这几个不是函数,而是一个值。它们提供你一些规则的信息。比如下面这个例子
  >>> p=re.compile( r'(?P<word>/b[a-z]+/b)|(?P<num>/b/d+/b)|(?P<id>/b[a-z_]+/w*/b)' , re.I )
  >>> p.flags
  2
  >>> p.pattern
  '(?P<word>//b[a-z]+//b)|(?P<num>//b//d+//b)|(?P<id>//b[a-z_]+//w*//b)'
  >>> p.groupindex
  {'num': 2, 'word': 1, 'id': 3}
  我们来分析一下这个例子:这个正则式是匹配单词、或数字、或一个由字母或’_’开头,后面接字母或数字的一个ID。我们给这三种情况的规则都包入了一个命名组,分别命名为’word’ , ‘num’ 和 ‘id’。我们规定大小写不敏感,所以使用了编译选项 ‘I’。
  编译以后返回的对象为p,通过p.flag我们可以查看编译时的选项,不过它显示的不是’I’,而是一个数值2 。其实re.I是一个整数,2就是它的值。我们可以查看一下:
  >>> re.I
  2
  >>> re.L
  4
  >>> re.M
  8
  …
  每个选项都是一个数值。
  通过p.pattern可以查看被编译的规则是什么。使用print的话会更好看一些
  >>> print p.pattern
  (?P<word>/b[a-z]+/b)|(?P<num>/b/d+/b)|(?P<id>/b[a-z_]+/w*/b)
  看,和我们输入的一样。
  接下来的p.groupindex则是一个字典,它包含了规则中的所有命名组。字典的key是名字,values是组的序号。由于字典是以名字作为key,所以一个无命名的组不会出现在这里。
  3.2 组与Match对象
  组与Match对象是Python正则式的重点。只有掌握了组和Match对象的使用,才算是真正学会了Python正则式。
  3.2.1 组的名字与序号
  正则式中的每个组都有一个序号,它是按定义时从左到右的顺序从1开始编号的。其实,re的正则式还有一个0号组,它就是整个正则式本身。
  我们来看个例子
  >>> p=re.compile( r’(?P<name>[a-z]+)/s+(?P<age>/d+)/s+(?P<tel>/d+).*’ , re.I )
  >>> p.groupindex
  {'age': 2, 'tel': 3, 'name': 1}
  >>> s=’Tom 24 88888888 <=’
  >>> m=p.search(s)
  >>> m.groups() # 看看匹配的各组的情况
  ('Tom', '24', '8888888')
  >>> m.group(‘name’) # 使用组名获取匹配的字符串
  ‘Tom’
  >>> m.group( 1 ) # 使用组序号获取匹配的字符串,同使用组名的效果一样
  >>> m.group(0) # 0 组里面是什么呢?
  'Tom 24 88888888 <='
  原来0组就是整个正则式,包括没有被包围到组里面的内容。当获取0组的时候,你可以不写这个参数。m.group(0)和m.group()的效果是一样的:
  >>> m.group()
  'Tom 24 88888888 <='
  接下来看看更多的Match对象的方法,看看我们能做些什么。
  3.2.2 Match对象的方法
  group([index|id]) 获取匹配的组,缺省返回组0,也就是全部值
  groups() 返回全部的组
  groupdict() 返回以组名为key,匹配的内容为values的字典
  接上例:
  >>> m.groupindex()
  {'age': '24', 'tel': '88888888', 'name': 'Tom'}
  start( [group] ) 获取匹配的组的开始位置
  end( [group] ) 获取匹配的组的结束位置
  span( [group] ) 获取匹配的组的(开始,结束)位置
  expand( template ) 根据一个模版用找到的内容替换模版里的相应位置
  这个功能比较有趣,它根据一个模版来用匹配到的内容替换模版中的相应位置,组成一个新的字符串返回。它使用/g<index|name>或 /index 来指示一个组。
  接上例
  >>> m.expand(r'name is /g<1> , age is /g<age> , tel is /3')
  'name is Tom , age is 24 , tel is 88888888'
  除了以上这些函数外,Match对象还有些属性
  pos 搜索开始的位置参数
  endpos 搜索结束的位置参数
  这两个是使用findall或match等函数时,传入的参数。在上面这个例子里,我们没有指定开始和结束位置,那么缺省的开始位置就是0,结束位置就是最后。
  >>> m.pos
  0
  >>> m.endpos
  19
  lastindex 最后匹配的组的序号
  >>> m.lastindex
  3
  lastgroup 最后匹配的组名
  >>> m.lastgroup
  'tel'
  re 产生这个匹配的Pattern对象,可以认为是个逆引用
  >>> m.re.pattern
  '(?P<name>[a-z]+)//s+(?P<age>//d+)//s+(?P<tel>//d+).*'
  得到了产生这个匹配的规则
  string 匹配的目标字符串
  >>> m.string
  'Tom 24 88888888 <='

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-370465-1-1.html 上篇帖子: Python字典的应用详解 下篇帖子: Python 学习入门(16)—— zipfile
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表