正则表达式“正向匹配和反向匹配”的妙⽤
相信⼤家在看正则表达式语法的时候都会遇到下⾯⼏种:正向肯定,正向否定,反向肯定,反向否定
1、(?=pattern)
正向肯定预查,在任何匹配pattern的字符串开始处匹配查字符串。
这是⼀个⾮获取匹配,该匹配不需要获取供以后使⽤。
例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,
但不能匹配“Windows3.1”中的“Windows”。
预查不消耗字符,也就是说,在⼀个匹配发⽣后,在最后⼀次匹配之后⽴即开始下⼀次匹配的搜索,
⽽不是从包含预查的字符之后开始。
2、(?!pattern)regex匹配
正向否定预查,在任何不匹配pattern的字符串开始处匹配查字符串。
这是⼀个⾮获取匹配,也就是说,该匹配不需要获取供以后使⽤。
例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,
但不能匹配“Windows2000”中的“Windows”。
3、(?<=pattern)
反向肯定预查,与正向肯定预查类似,只是⽅向相反。
例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,
但不能匹配“3.1Windows”中的“Windows”。
4、(?<!pattern)
反向否定预查,与正向否定预查类似,只是⽅向相反。
例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,
但不能匹配“2000Windows”中的“Windows”。
我第⼀次看的时候就觉得很难理解,读了两遍好不容易理解了,但是⼀直⽤不上,直到⼯作需要...............
str = "111/;hkakdhaldladhl;gddhkshls;hhhh"
⽤ ; 切割字符串,要求切割结果是111/;hkakdhaldladhl        gddhkshls        hhhh,也就是第⼀个;前⾯有/,所以第⼀个;不分割,只分割后⾯的;
这其实就⽤到了反向否定,将python⾥⾯的split函数和正则表达式完美结合在⼀起,⼤家根据我的例⼦再去理解正(反)向否(肯)定匹配,肯定就更清晰了
python代码实现:
import re
str = "111/;hkakdhaldladhl;gddhkshls;hhhh"
str_list = re.split(r"(?<!\/);",str)
print(str_list)
结果:
注:?<! 是反向否定的意思, \/  是对  /  做了转义
为了能记得住,我总结了下⾯的规律,供参考~~
"肯定" 就是出现在?<!    ?<=    ?!  ?= 后⾯那些字符,我们要匹配的字符串带这个才去匹配
"否定"就是出现在?<!    ?<=    ?!  ?= 后⾯那些字符,我们要匹配的字符串不带这个才去匹配
"正反向"就是例⼦⾥⾯windows在 ?<!    ?<=    ?!  ?= 以及后⾯字符的前⾯还是后⾯,windows在后是反向,在前是正向记起来就是,四种都要带? 肯定的是=  否定的是!    如果是反向就加上<