正则表达式?:和?=的区别
区别在于 ?=是正向肯定 断言,进行的匹配是不占查询长度的;而 ?:是非获取 匹配,进行的匹配是占据查询长度的。
(?: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))