正则表达式之零宽断言

正则表达式之零宽断言

零宽断言:用于查找特定内容之前或之后的内容,但并不包括特定内容本身。
断言用来声明一个应该为真的事实。正则表达式中只有当断言为真时才会继续进行匹配。
简单来说就是匹配一个位置,这个位置满足某个正则,但不纳入结果的,所以叫“零宽断言”,而且这个位置的前面或后面需要满足某种正则。

分类 代码/语法 说明
零宽度正预测先行断言 (?=exp) 匹配exp前面的位置
零宽度正回顾后发断言 (?<=exp) 匹配exp后面的位置
零宽度负预测先行断言 (?!exp) 匹配后面跟的不是exp的位置
零宽度负回顾后发断言 (?<!exp) 匹配前面不是exp的位置

下面结合例子来理解下什么是零宽断言。
零宽断言

1
2
3
正则表达式:(?<=<div>).*(?=</div>) 
匹配字符串:<div>www.axiaowei.cn</div>
匹配结果:www.axiaowei.cn


1
2
3
正则表达式:(?<=<div>).*
匹配字符串:<div>www.axiaowei.cn</div>
匹配结果:www.axiaowei.cn</div>


1
2
3
正则表达式:(?=www).*(?<=cn)
匹配字符串:<div>www.axiaowei.cn</div>
匹配结果:www.axiaowei.cn


负向零宽断言

1
2
3
正则表达式:\d{3}(?!\d) ->匹配三位数字的后面不能是数字
匹配字符串:235456123
匹配结果:123


1
2
3
正则表达式:(?<![a-z])\d{7} ->匹配前面不是小写字母的七位数字
匹配字符串:1111111d2222222d3333333S4444444
匹配结果:1111111, 4444444


这里举一个常见的简单计算题,我们利用零宽断言进行匹配。
三秒中算出式子(每次刷新式子也会变化),想必能算出来输入提交也超过三秒了吧,直接写python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# coding: utf-8

import re
import requests

url = 'http://123.206.31.85:10002/'
convert = requests.session()
html = convert.get(url).text
reg = re.compile(r'.+(?=</p>)').findall(html) # 零宽断言匹配

link = ''
for i in reg:
link += i
data = eval(link)

post = convert.post(url, {'result': data})
print('三秒之内计算出以下式子:\n', link, '=', data)
print(post.text)

参考资料:
http://deerchao.net/tutorials/regex/regex.htm

-本文结束感谢您的阅读-