前面讲到的正则表达式都是如何匹配表达式所表达的意思,如[a-z]+是匹配1个以上a-z的字母。今天我们讲到的是前后查找的例子,首先我们讲到向前查找的语法:
(?=表达式)
我们举一个例子,假设我们在如下列表中想获取协议名
http://
ftp://
https://
按照我们一般的写法是
[a-z]+:
这样写存在一个问题,就是会匹配“:”本身。这样就不是想要的结果,如果不想要匹配冒号本身,就需要使用本章介绍的向前匹配,基本的思路使用冒号先前匹配一系列字母:
[a-z]+(?=:)
这样匹配的结果就是
http
ftp
https
这样就符合我们的要求了,既返回了我们想要的协议列表。
接下来我们讲到向后匹配,同样的我们来说语法,向后匹配的语法与向前匹配很像,只是加了一个箭头:
(?<=表达式)
假设我们要匹配一下列表中的数字:
$12.36
$25.36
$45.65
如果仅需要匹配数字,而不是“$”符号,同前面一样,我们需要使用向后匹配,按照前面的写法,写成是这样的:
(?<=\$)[0-9.]+
最终匹配的结果就是:
12.36
25.36
45.65
如果综合运用向前和向后匹配,我们可以举一个扒网页的例子,一般html语法是这样的,如爬取到的网页标题一般是这样的:
<title> this is title</title>
那么如何获取title标签内部的值,而不匹配或消费本身呢?最终的表达式应该是如下,有兴趣可以仔细研究下这种写法
(?<=<title>).*?(?=</title>)