使用regex pig从url中提取数字字符串

guz6ccqo  于 2021-06-21  发布在  Pig
关注(0)|答案(2)|浏览(539)

我使用pig生成最近访问过的url列表。在每个url中,都有一个表示所访问的产品页的数字字符串。我在试着用 regex_extract_all() 函数只提取长度从6到8不等的数字字符串。数字串可以直接在后面找到 jobs2/view/ 通常以 +&cd 但有时他们会以 ) .
以下是几个示例URL:
(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=香港)
下面是我正在使用的当前正则表达式:

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]*' ; 这些都不管用。
有人能帮忙吗?或者有别的办法吗?
非常感谢,嗯

jdzmm42g

jdzmm42g1#

“意外字符‘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)

3okqufwl

3okqufwl2#

我对pig不太熟悉,但这个正则表达式会匹配你的目标:

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

通过使用(非消耗性的)向后看,整个匹配项(而不仅仅是一组匹配项)就是您的号码。

相关问题