全部博文(298)
分类: Python/Ruby
2012-04-22 14:40:29
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表达式
1. strTest = "aaa111aaa , bbb222&, 333ccc"
2. strRe = r"(?
3. reObj = re.compile(strRe)
4. print reObj.findall(strTest)
输出:(正则的意思是找出连续的数字,并且第一个数字的前面不能是a-z中的一个字符)
1. ['11', '22', '333']
这里要注意的一个问题是:在python和Perl中两个反向界定的表达式exp只允许使用定长文本,譬如最后第四个例子,如果正则表达式写成:strRe = r"(?,py解释器会报错:error: look-behind requires fixed-width pattern。
(二)命名组和无捕获组
python里面还有一种命名组和无捕获组
命名组比较牛×,也是python的扩展,能把捕获组向使用字典一样的使用:
1. s= 'Tom:9527 , Sharry:0003'
2. m=re.match( r'(?P
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)