使用正则表达式PIG从URL中提取数字字符串

时间:2014-09-19 20:59:45

标签: regex apache-pig extract regex-lookarounds lookaround

我使用PIG生成最近访问过的网址列表。在每个URL中,都有一串数字代表访问过的产品页面。我试图使用regex_extract_all()函数只提取数字字符串,其长度从6到8不等。数字字符串可以在jobs2/view/后直接找到,通常以+&cd结尾,但有时可能会以)结尾。

以下是一些示例网址:

http://a.com/search?q=cache:QD7vZRHkPQoJ:ca.xyz.com/jobs2/view/17069404+&cd=1&hl=en&ct=clnk&gl=ca) (http://a.com/search?q=cache:G9323j2oNbAJ:ca.xyz.com/jobs2/view/5977065+&cd=1&hl=en&ct=clnk&gl=ca) (http://a.com/search?q=cache:aNspmG11qAJ:hk.xyz.com/jobs2/view/16988928+&cd=2&hl=zh-TW&ct=clnk&gl=hk) (http://a.com/search?q=cache:aNspmG11AJ:hk.xyz.com/jobs2/view/16988928+&cd=2&hl=zh-TW&ct=clnk&gl=hk) (http://a.com/search?q=cache:aNspmG11qAJ:hk.xyz.com/jobs2/view/16988928+&cd=2&hl=zh-TW&ct=cl k& gl = hk)

这是我正在使用的当前正则表达式:

J = FOREACH jpage GENERATE FLATTEN(REGEX_EXTRACT_ALL(TEXTCOLUMN, '\/view\/(\d+)\+\&')) as (output:chararray)

我也尝试过其他形式,例如:

'[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]''view.([0-9]+)''view\/([\d]+)\+'

'[0-9][0-9][0-9]+',和 '[0-9][0-9][0-9]*';没有一个工作。

任何人都可以在这里提供帮助,或者采取其他方式解决问题吗?

非常感谢, MM

2 个答案:

答案 0 :(得分:1)

“意外字符'D'”的原因是,您需要使用双反斜杠而不是单反斜杠。例如,只需将[\ d +]替换为[\\ d +]

这里是您的解决方案,请验证所有输入字符串

input.txt
http://a.com/search?q=cache:QD7vZRHkPQoJ:ca.xyz.com/jobs2/view/17069404+&cd=1&hl=en&ct=clnk&gl=ca  
http://a.com/search?q=cache:G9323j2oNbAJ:ca.xyz.com/jobs2/view/5977065+&cd=1&hl=en&ct=clnk&gl=ca  
http://a.com/search?q=cache:aNspmG11qAJ:hk.xyz.com/jobs2/view/16988928+&cd=2&hl=zh-TW&ct=clnk&gl=hk  
http://a.com/search?q=cache:aNspmG11AJ:hk.xyz.com/jobs2/view/16988928+&cd=2&hl=zh-TW&ct=clnk&gl=hk  
http://a.com/search?q=cache:aNspmG11qAJ:hk.xyz.com/jobs2/view/16988928+&cd=2&hl=zh-TW&ct=clk&gl=hk  
http://a.com/search?q=cache:aNspmG11qAJ:hk.xyz.com/jobs2/view/16988928)=2&hl=zh-TW&ct=clk&gl=hk  
http://webcache.googleusercontent.com/search?q=cache:http://my.linkedin.com/jobs2/view/9919248

Updated Pigscript:
A = LOAD 'input.txt' as line;
B = FOREACH A GENERATE REGEX_EXTRACT(line,'.*/view/(\\d+)([+|&|cd|)?]+)?',1);
dump B;

(17069404)
(5977065)
(16988928)
(16988928)
(16988928)
(16988928)

答案 1 :(得分:0)

我不熟悉PIG,但这个正则表达式符合您的目标:

(?<=/jobs2/view/)\d+

通过使用后面的(非消费)外观,整个匹配(不仅仅是匹配的)是您的号码。