Извлечь строку чисел из URL с помощью регулярного выражения PIG
Я использую 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]*'
; ни одна из которых не работает.
Кто-нибудь может помочь здесь или есть другой способ сделать это?
Высоко ценится, мм
2 ответа
Причина "Неожиданный символ" 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)
Я не знаком с PIG, но это регулярное выражение будет соответствовать вашей цели:
(?<=/jobs2/view/)\d+
Используя (не потребляющий) взгляд сзади, все совпадение (а не просто группа совпадений) - это ваш номер.