正则表达式 ?=理解 及实例验证

要理解?=和?!,首先需要理解前瞻,后顾,负前瞻,负后顾四个概念: 前瞻:exp1(?=exp2) 查找exp2前面的exp1 后顾:(?

要理解?=和?!,首先需要理解前瞻,后顾,负前瞻,负后顾四个概念:

// 前瞻:
exp1(?=exp2) 查找exp2前面的exp1
// 后顾:
(?<=exp2)exp1 查找exp2后面的exp1
// 负前瞻:
exp1(?!exp2) 查找后面不是exp2的exp1
// 负后顾:
(?<!exp2)exp1 查找前面不是exp2的exp1

举例:

"中国人".replace(/(?<=中国)人/, "rr") // 匹配中国人中的人,将其替换为rr,结果为 中国rr
"法国人".replace(/(?<=中国)人/, "rr") // 结果为 法国人,因为人前面不是中国,所以无法匹配到

 

举例:

s='我这么聪明啊'
print(re.sub('(?=这)','为什么',s))
-----------输出---------------
我为什么这么聪明啊

个人理解(可能是错误的,自己能够明白):?在这里表示一个占位符,exp2的值能够匹配到的话,配合python正则中的sub方法,可以将?变为自己想要的值插入到匹配到的值前面

下面展示一个金额千分位分割的例子:

s1='100000000000000000000000000'

print(re.sub('(?=((\d{3})+$))',',',s1))

-----------输出-----------

,100,000,000,000,000,000,000,000,000

解释一下:从结尾开始匹配,三位数字为一组,前面用,分隔开

这里有个问题,因为把边界也替换了,下面为修改后的代码

s1='100000000000000000000000000'

print(re.sub('(?=\B((\d{3})+)$)',',',s1))

-----------------输出----------------
100,000,000,000,000,000,000,000,000

 \B在这里表示不匹配边界

 

这里确实有点难理解,我把自己的想法写在这里,有不对的地方请大伙及时指出,互相学习

 


原文链接:https://blog.csdn.net/csm0912/article/details/81206848