python re零宽断言踩坑
在在线的正则校验工具上写了大半天才写出来的表达式,往python里一粘贴复制,代码行飘红,强行运行之后,报错.
表达式:
#用单引号替换txt_line中匹配到的双引号
param = re.sub(r'(?<=param":(\s)*"\{(.*))"(?=.*(\})", "(in|co))','\'',txt_line)
re.error: look-behind requires fixed-width pattern
错误原因就是在
(?<=param":(\s)*"\{(.*))
这里用例*号来表示变长字符了.而re模块不支持断言变长.如果改成
param = re.sub(r'(?<=param":(\s)"\{)"(?=(\})", "(in|co))','\'',txt_line)
就不会报错了.但是也就无法匹配到我想要的字符了.
零宽断言分类
零宽断言可分为正向、反向两类,每类又分为预测先行和回顾后发两种:
正预测先行断言
语法是(?=exp),它断言此位置的后面能匹配表达式exp.
正回顾后发断言
语法是(?<=exp),它断言此位置的前面能匹配表达式exp.
负预测先行断言
语法是(?!exp),它断言此位置的后面不能匹配表达式exp.
负回顾后发断言
语法是(?<!exp),它断言此位置的前面不能匹配表达式exp.