正则表达式?:和?=的区别

Z, ZLW 669

区别在于 ?=是正向肯定 断言,进行的匹配是不占查询长度的;而 ?:是非获取 匹配,进行的匹配是占据查询长度的。(?:pattern) 匹配得到的结果包含pattern,(?=pattern) 则不包含

1、(?:pattern)

()表示捕获分组,()会把每个分组里的匹配的值保存起来,从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推

(?:)表示非捕获分组,和捕获分组唯一的区别在于,非捕获分组匹配的值不会保存起来

2、(?=pattern)

正向肯定预查(look ahead positive assert),匹配pattern前面的位置。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。

简单说,以 xxx(?=pattern)为例,就是捕获以pattern结尾的内容xxx

例如,”Windows(?=95|98|NT|2000)”能匹配”Windows2000″中的”Windows”,但不能匹配”Windows3.1″中的”Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

3、区别

!/usr/bin/python

– coding: UTF-8 –

import re

phone = “1233-hfdh”

匹配的是123

?:后面匹配消耗字符,也就是说在一个匹配发生后,后面的匹配是?:匹配到的23后面开始继续匹配

print(re.search(‘1(?:23)’, phone))
print(re.search(‘1(?:23)23’, phone))

匹配的是1

?=后面匹配不消耗字符,也就是说在一个匹配发生后,后面的匹配是从前面的1后面开始而不是从?=匹配到的23后面开始继续匹配

print(re.search(‘1(?=23)’, phone))
print(re.search(‘1(?=23)23’, phone))

回复

我来回复
  • 暂无回复内容

注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部