Синтаксис регулярного выражения в R - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь следующее, что должно позволить мне получить все между productUrl:// и следующим ?

(?<=\"productUrl\"\:\"\/\/)(.*?)(?=\?)

Выше работает на https://regexr.com/

Затем я пытаюсь избежать обратной косой черты, чтобы вставить эту строку в функцию grep, но безуспешно. Как правильно это сделать?

См. Этот пример: ссылка на пример

Мне действительно нужно извлечь подстроки, которые соответствуют моему шаблону, чтобы grep мог использоваться вместе с другой функцией.

1 Ответ

0 голосов
/ 07 января 2019

Обратите внимание, что вам не нужно экранировать / в шаблонах R регулярных выражений, так как они определены строковыми литералами, а / не является специальным метасимволом регулярных выражений. Если вы хотите написать " внутри "..." строкового литерала, вы должны экранировать его одним \, как вы уже делаете.

Вы можете избежать переопределения здесь, если будете использовать одинарные кавычки для определения строкового литерала и если вы превратите .*?(?=\?) в отрицательный символьный класс:

grep('(?<="productUrl":"//)([^?]*)', x, perl=TRUE)

Класс отрицательных символов [^?]* соответствует любым 0 или более символам, кроме ?.

Если строка, по которой вы проверяете, не имеет двойных кавычек, удалите их из области просмотра:

grep('(?<=productUrl://)([^?]*)', x, perl=TRUE)

Вместо внешнего вида вы также можете использовать \K, чтобы опустить соответствующую часть текста:

grep('productUrl://\\K[^?]*', x, perl=TRUE)
                   ^^^ 

На самом деле, вам даже не нужна группа захвата в вашем шаблоне.

Решение актуальной задачи

Вы не можете извлечь подстрок с grep в R, вы можете только найти / идентифицировать элементы для выборки из вектора символов, используя grep. Для извлечения подстрок необходимо использовать базовые функции R regmatches или stringr str_extract / str_extract_all или аналогичные match.

Пример с основанием R:

> x <- '":"ppath","value":[],"hidden":false,"locked":false}],"bizData":"","pos":0},"listItems":[{"name":"BRAND\'S® Lutein Essence 6 Bottles x 60ml","nid":"66765568","icons":[{"domClass":"lazMall","text":"LazMall","alias":"LazMallAlias","type":"img","group":"1","showType":"0","order":0}],\n"productUrl":"//www.lazada.sg/products/brands-lutein-essence-6-bottles-x-60ml-i138897006-s167303363.html?search=1","image":"https://sg-test-11.slatic.net/p/5337f879236ece2f14158c055adcdef7.jpg",\n"productUrl":"//www.lazada.sg/products/brands-lutein-essence-6-bottles-x-60ml-i138897006-s167303363.html?search=1","sku":"BR924HBAB3R0N4SGAMZ","skuId":"167303363"}],"restrictedAge":0,"categories":[1438,1565,4776,7305'
> regmatches(x, gregexpr('"productUrl":"\\K[^?"]*', x, perl=TRUE))
[[1]]
[1] "//www.lazada.sg/products/brands-lutein-essence-6-bottles-x-60ml-i138897006-s167303363.html"
[2] "//www.lazada.sg/products/brands-lutein-essence-6-bottles-x-60ml-i138897006-s167303363.html"

С stringr :

> library(stringr)
> str_extract_all(x, '(?<="productUrl":")[^?"]*')
[[1]]
[1] "//www.lazada.sg/products/brands-lutein-essence-6-bottles-x-60ml-i138897006-s167303363.html"
[2] "//www.lazada.sg/products/brands-lutein-essence-6-bottles-x-60ml-i138897006-s167303363.html"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...