(?:pattern)(?=pattern)、(?=pattern)、(?!pattern)、(?<=pattern)和(?<!pattern)
(?:pattern)
pattern
:表示表达式
#1.(?:pattern)"""()表示捕获分组,()会把每个分组里的匹配的值保存起来,从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推(?:)表示非捕获分组,和捕获分组唯一的区别在于,非捕获分组匹配的值不会保存起来[\u4e00-\u9fa5]中文"""m=re.search("(\d)([\u4e00-\u9fa5]*)([a-z]*)\s(\d*)","afa455阿登哥love520")print(m)#'455阿登哥love#re.Match对象可以调用group()方法print(m.group(0,1,2,3,4))#('455阿登哥love520','455','阿登哥','love','520')#在分组里使用?:m=re.search("(?:\d)(?:[\u4e00-\u9fa5]*)([a-z]*)\s(\d*)","afa455阿登哥love520")print(m.group(0,1,2))#('455阿登哥love520','love','520')#27行对比22行代码返回结果455和阿登哥并没有保存下来#--------------findall()(?:pattern)单个情况可以匹配到表达式全部内容----------------print(re.findall('(?:ab)123','ababab123'))#findall的结果不是匹配的全部内容,而是组内的内容,?:可以让结果为匹配的全部内容['ababab123']print(re.findall('href="(.*?)"','<ahref="http://www.百度.com">点击</a>'))#['http://www.百度.com']print(re.findall('href="(?:.*?)"','<ahref="http://www.百度.com">点击</a>'))#['href="http://www.百度.com"'](?=pattern)、(?!pattern)、(?<=pattern)和(?<!pattern)
importre#(?=pattern)简单说,以xxx(?=pattern)为例,就是捕获以pattern结尾的内容xxxprint(re.findall("Windows(?=95|98|NT|2000)","Windows2000_WindowsNT_WindowsXP"))#['Windows','Windows']#(?!pattern)简单说,以xxx(?!pattern)为例,就是捕获不以pattern结尾的内容xxxprint(re.findall("Windows(?!95|98|NT|2000)","Windows2000_WindowsNT_WindowsXP"))#['Windows']#(?<=pattern)简单说,以(?<=pattern)xxx为例,就是捕获以pattern开头的内容xxxprint(re.findall("(?<=2000)year","abc2000year444"))#['year']#(?<!pattern)简单说,以(?<!pattern)xxx为例,就是捕获不以pattern开头的内容xxx。print(re.findall("(?<!2000)year","032year444"))#['year']百度网上的一些资料
#----------------------------------------------------------print(re.findall("egon(?=100|N)(?=N)N123","egonN123"))#['egonN123']位置:01234567字符串:egonN123分析:步骤1、正则表达式egon匹配到了字符串的位置3然后连续进行两次断言匹配步骤2、(?=100|N)从位置3作为起始匹配位置4的字符是否100或者N步骤3、2成功后,继续匹配(?=N),因为?=patter不会吃字符,所以此时会重新回到步骤1所在位置3,然后继续匹配,匹配成功步骤4、从位置3开始匹配N123思考下述输出结果,为何会不同???:print(re.findall("egon(?=100|N)(?=N)N123","egonN123"))print(re.findall("egon(?=100|N)(?=N)123","egonN123"))从3位置匹配后面没匹配到123所以返回为空列表#-------------------------------------------------------------介绍
(pattern):匹配pattern并获取这一匹配,所获取的匹配可以从产生的Matches集合得到。
(?:pattern):匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。
(?=pattern):正向预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
共同点
(?:pattern)与(?=pattern)都匹配pattern,但不会把pattern结果放到Matches的集合中,即Matcher.group()不会匹配到(?;pattern)与(?=pattern)
区别
(?:pattern)匹配得到的结果包含pattern,(?=pattern)则不包含。如:
对字符串:"industryabc"的匹配结果:
industr(?:y|ies)--->"industry"
industr(?=y|ies)--->"industr"
是否消耗字符:
(?:pattern)消耗字符,下一字符匹配会从已匹配后的位置开始。
(?=pattern)不消耗字符,下一字符匹配会从预查之前的位置开始。
即后者只预查,不移动匹配指针。如: