最近在用正则表达式,分析网页抽取结果的时候,碰到了一些问题,大体做个记录
1.子表达式,利用()可以抽取出,匹配的字符串中的一个字段
比如,用来抽取google的,搜索结果,可以这样写(?<=<li class=g>).*?<.*?><a.*?href="(.*?)"[^>]*?>(.*?)</a>(.*?)<br>.*?<cite>(.*?)</CITE>.*?(?=</a></span>.*?</div>)。其中里面的一些()(当然不全是,比如带问号的{?<=<li class=g>)},就是为了抽取更进一步的字段设立的,比如链接,标题,摘要等。
2.非贪婪匹配
即在表示数量的元字符后面加上?,比如“.*?”,这样可以使匹配的字符串尽量短,这也是在这种网页分析中需要的效果。
3.匹配中出现,memory exhausted.即内存耗尽的运行时异常
简单的处理是捕获这个异常,但这样处理是等到问题已经严重到使内存耗尽的时候才去处理。实际上这个问题是由于正则表达式不完全匹配,导致匹配无法终止,直到耗尽内存。更合理的作法,一般是要重新写匹配部分,把它写进一个线程,进行计时,当超时时断定异常并销毁这个线程。
另外也许考虑重新写更安全的正则式,可以避免这个问题的发生。
4.不匹配某个字符串
不匹配某个字符比较容易写,直接[^c]就可以了,对于字符串则应当这样处理采用
((?!regex).)* 这个就是不包含字符串"regex"的字符串。为了避免把(?!regex)当作一个子表达式式,可以这样修改(?:(?!regex).)*