技术专题

正则表达式 元搜索应用

2009年3月12日 阅读(229)

最近在用正则表达式,分析网页抽取结果的时候,碰到了一些问题,大体做个记录

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).)*
 

You Might Also Like