Извлечь самое короткое соответствие строки регулярного выражения - PullRequest
2 голосов
/ 11 февраля 2020

Минимальное значение

Предположим, у меня есть строка as1das2das3D. Я хочу извлечь все от буквы a до буквы D. Есть три различных подстроки, которые соответствуют этому - я хочу самое короткое / самое правое соответствие, то есть as3D.

Одно решение, которое я знаю, чтобы сделать эту работу - stringr::str_extract("as1das2das3D", "a[^a]+D")

Реальный пример

К сожалению, я не могу заставить это работать с моими реальными данными. В моих реальных данных у меня есть строка с (потенциально) двумя URL-адресами, и я пытаюсь извлечь тот, за которым сразу следует rel=\"next\". Итак, в приведенной ниже строке примера я хотел бы извлечь URL https://abc.myshopify.com/ZifQ.

foo <- "<https://abc.myshopify.com/YifQ>; rel=\"previous\", <https://abc.myshopify.com/ZifQ>; rel=\"next\""

# what I've tried
stringr::str_extract(foo, '(?<=\\<)https://.*(?=\\>; rel\\="next)')          # wrong output
stringr::str_extract(foo, '(?<=\\<)https://(?!https)+(?=\\>; rel\\="next)')  # error

Ответы [ 3 ]

1 голос
/ 11 февраля 2020

Вы можете сделать:

stringr::str_extract(foo,"https:[^;]+(?=>; rel=\"next)")
[1] "https://abc.myshopify.com/ZifQ"

или даже

stringr::str_extract(foo,"https(?:(?!https).)+(?=>; rel=\"next)")
[1] "https://abc.myshopify.com/ZifQ"
0 голосов
/ 11 февраля 2020

Здесь может быть вариант.

gsub(".+\\, <(.+)>; rel=\"next\"", "\\1", foo, perl = T)
#[1] "https://abc.myshopify.com/ZifQ"
0 голосов
/ 11 февраля 2020

Будет ли это вариант?

Разделение строки на ; или ,, сравнение ее с целевой строкой и получение URL-адреса из предыдущего индекса.

urls <- strsplit(foo, ";\\s+|,\\s+")[[1]]
urls[which(urls == "rel=\"next\"") - 1]
#[1] "<https://abc.myshopify.com/ZifQ>"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...