登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

银河里的星星

落在人间

 
 
 

日志

 
 

正则表达式 元搜索应用  

2009-03-12 12:13:24|  分类: 技术专题 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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

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

  评论这张
 
阅读(562)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018