首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

(?=pattern)怎么理解

2012-05-16 
(?pattern)如何理解查了不少资料,始终没法理解单个(?pattern)和?pattern)不明白为什么re.compile(r((?

(?=pattern)如何理解
查了不少资料,始终没法理解单个(?=pattern)和?=pattern)

不明白为什么re.compile(r'((?=.*AAA)(?=.*BBB).*)')能在一行中同时匹配AAA和BBB,像如下的line

line1 = "rwx BBB abc AAA xyzd"
line2 = "AAA xyzd rwx BBB abc"

re.compile(r'((?=.*AAA).*)') 匹配含有AAA的行
re.compile(r'((?=.*BBB).*)') 匹配含有BBB的行

为什么re.compile(r'((?=.*AAA)(?=.*BBB).*)')就可以同时匹配AAA和BBB,而且不分顺序

另外还请教下各位高手
1,re.compile(r'((?=AAA).*)') 是匹配以AAA开头的行么
2,(AAA)(.*?)(BBB) 和AAA.*?BBB是一样的效果吗,带括号和不带括号在这种情况下有什么区别吗

谢谢大家

[解决办法]
预见匹配匹配到括号中的字符串时,并不将匹配的指针后移,所以,它可以同时在一行中匹配多个字符串,并且不用考虑先后顺序。
[解决办法]
呵呵,有时间啃下这篇鹰文,你就能搞明白了.
http://www.experts-exchange.com/Programming/Languages/Regular_Expressions/A_4318-Regular-Expression-Lookaround-Demystified.html
lookaround分为lookahead,lookbehind,通通属于non-comsuing,意思是只做判断,不捕获,不影响具体的匹配指针,就是图里的蓝色箭头和红色箭头。
我给你这个正则应用的正是lookahead的positive判定
至于((?=AAA)(?=BBB).*)为什么匹配不了,逻辑上很好理解,意为同时以AAA和BBB做为起始的串,这不是矛盾了么,去哪找这样的串?和普通的逻辑 if i==2 and i==3 一样,怎么可能i即是2又是3.


[解决办法]
1、(?=pattern)是look ahead的方式匹配,了解过自动机应该很好理解这个需求的,通过后即的输入确定当前的匹配;
2、加括号是为了分组,方便向后引用,在替换等操作中非常有用。

热点排行