re in python

Py正则表达式中的【零宽断言】

 

转自:http://blog.csdn.net/magictong/article/details/5332423

 

(一)零宽断言

 说明:本文的例子使用python描述
      首先说明一下什么是零宽断言,所谓零宽断言就是并不去真正的匹配字符串文本,而仅仅是匹配对应的位置。
      正则表达式中有很多这样的断言,常见的如匹配字符串或者行的起始位置 ^ 和 /A,匹配字符串或者行的末尾 $ 和 /Z,单词边界/B等等。这些简单的就不说了,今天主要说一下界定的使用方法(有些资料叫环式结构,名字而已,不重要)。界定也是一种零宽断言,界定主要有四类:
      1、前向界定(肯定顺序环视)(?=exp)
      表示右边要匹配exp表达式

1.      strTest = "aaa111aaa , bbb222&, 333ccc"  

2.      strRe = r"\d+(?=[a-z]+)"  

3.      reObj = re.compile(strRe)  

4.      print reObj.findall(strTest)  

      输出:(正则的意思是找出连续的数字并且最后一个数字跟着至少一个a-z里面的字符序列)

1.       ['111''333']  

 

      2、前向否定界定(否定顺序环视)(?!exp)
      
表示右边不匹配exp表达式

1.      strTest = "aaa111aaa , bbb222&, 333ccc"  

2.      strRe = r"\d+(?![a-z]+)"  

3.      reObj = re.compile(strRe)  

4.      print reObj.findall(strTest)  

      输出:(正则的意思是找出连续的数字,并且最后一个数字后面不能跟任何一个a-z里面的字符序列)

1.      ['11''222''33']  

 

      3、反向界定(肯定逆序环视)(?<=exp) 文本必须定长
      表示左边要匹配exp表达式

1.      strTest = "aaa111aaa , bbb222&, 333ccc"  

2.      strRe = r"(?<=[a-z])\d+"  

3.      reObj = re.compile(strRe)  

4.      print reObj.findall(strTest)  

      输出:(正则的意思是找出连续的数字,并且第一个数字的前面要是a-z中的一个字符)

1.       ['111''222']  

      4、反向否定界定(否定逆序环视)(?<!exp) 文本必须定长
      
表示左边不要匹配exp表达式

1.      strTest = "aaa111aaa , bbb222&, 333ccc"  

2.      strRe = r"(?<![a-z])\d+"  

3.      reObj = re.compile(strRe)  

4.      print reObj.findall(strTest)  

      输出:(正则的意思是找出连续的数字,并且第一个数字的前面不能是a-z中的一个字符)

1.       ['11''22''333']  

 

      这里要注意的一个问题是:在python和Perl中两个反向界定的表达式exp只允许使用定长文本,譬如最后第四个例子,如果正则表达式写成:strRe = r"(?<![a-z]+)\d+",py解释器会报错:error: look-behind requires fixed-width pattern。

 

(二)命名组和无捕获组

      python里面还有一种命名组和无捕获组
命名组比较牛×,也是python的扩展,能把捕获组向使用字典一样的使用:

1.      s= 'Tom:9527 , Sharry:0003'   

2.      m=re.match( r'(?P<name>\w+):(?P<num>\d+)' , s)   

3.      print m.group()   

4.      print m.group(0)  

5.      print m.group(1)  

6.      print m.group(2)  

7.      print m.groups()   

8.      print m.group("name")   

9.      print m.group("num")   

      输出:

1.      Tom:9527  

2.      Tom:9527  

3.      Tom  

4.      9527  

5.      ('Tom''9527')  

6.      Tom  

7.      9527  

      无捕获组的使用也是类似,语法:(?:exp)只是无捕获组匹配exp,但不捕获匹配的文本,也不给这个组分配组号。

      用这种方法还能写正则表达式的注释,呵呵,语法:(?#exp),exp是注释,不对整个正则表达式产生任何副作用,仅供阅读。

 

      使用python写的一个洗牌程序,简洁吧,嘿嘿。

1.      #! /usr/bin/env python   

2.      # -*- coding: utf-8 -*-   

3.        

4.      from random import shuffle  

5.      from random import choice  

6.        

7.      values = range(2, 11) + 'Jack Queen King A'.split()  

8.      suits = 'diamonds clubs hearts spades'.split()  

9.        

10.   deck = ['%s_%s' % (v, s) for v in values for s in suits]  

11.     

12.   打乱顺序  

13.   shuffle(deck)  

14.     

15.   while deck:  

16.       随机取一个  

17.       randomCard = choice(deck)  

18.       print randomCard  

19.       deck.remove(randomCard)  

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值