Chinaunix

标题: 有人用gnu regex吗? [打印本页]

作者: newmax123    时间: 2012-04-05 09:56
标题: 有人用gnu regex吗?
事情是这样的,我有一个页面内容抽取的爬虫,现在用了  posix regex, 一切都好 但是cpu 非常非常高。

对此 我想用gnu regex 进行一次替代,但是否能提高速度

代码如下

const char *regex_pattern = "<a\\s{1,7}href=[^>\\']{0,300}products/[^>]{0,300}.html[^>]{0,5}>[^<]{0,300}</a>";
struct re_pattern_buffer pattern_buffer ={0};
const char *errcode;
re_syntax_options = RE_SYNTAX_POSIX_BASIC;
/* 進行編譯 Regular Expression */
int patternlen = strlen(regex_pattern);  // 获得表达式长度

// 编译表达式
errcode = re_compile_pattern( regex_pattern,
                              patternlen,
                              &pattern_buffer);


// 开始search
struct re_registers regs ={0};
int lens = strlen(filestr.c_str());  // 获得原文长度
int result = re_search(&pattern_buffer,
         filestr.c_str(),
              lens,
              0,
              lens,
              &regs);


失败了....
同样的字符用posix 是没有问题的。那里有问题呢?
还有个问题 ,result  返回的是匹配以后的头字符,那里找到最后的结果呢?


作者: bruceteen    时间: 2012-04-05 11:12
要想速度快,就不能用正则表达式
再说你的 "<a\\s{1,7}href=[^>\\']{0,300}products/[^>]{0,300}.html[^>]{0,5}>[^<]{0,300}</a>" 很简单
直接用 strstr 吧,还省掉引入一个外部库
作者: newmax123    时间: 2012-04-05 11:22
我知道, 但是里面用到 regex 的不止一处, 用strstr 误判率很高很高。 因为 html 不规范的地方很多。
作者: newmax123    时间: 2012-04-23 13:24
哥后悔了,改成string 方式 memory 从300M 降到了9M. cpu 从400% 降到3%.
作者: walleeee    时间: 2012-04-23 13:54
原来爬虫出在这里。我还以为是前面那个,算了

不知道做这个事情不该用动态正则么?静态正则才做这个。算了
作者: newmax123    时间: 2012-04-27 21:18
你知道爬虫只是占我整个系统里的比例是多少吗?
作者: walleeee    时间: 2012-04-27 22:07
管你占多少,这和本问题无关。
作者: walleeee    时间: 2012-04-27 22:07
你如果是发给我,请回复我,不然就不要和我说话




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2