Извлечь несколько путей из строки - PullRequest
0 голосов
/ 09 февраля 2020

Я изо всех сил пытаюсь найти лучшее решение для извлечения нескольких URL из (очень длинной) строки.

Вот пример текста:

miserie <- "some text /Home/123/home-name/Specs some other text http://www.example.com/Specs some other text /Home/456/home-name/Specs"

Редактировать : Обновленный пример:

miserie <- "/Home/homes?query=123 qdf /Home/123/home-name/Specs , homeurl : http://www.example.com/ },{ id :1, y : 02 , p :false, url : /Home/456/home-name/Specs"

Это результат, который я хочу:

[1] "/Home/123/home-name/Specs"
[2] "/Home/456/home-name/Specs"

По сути, мне нужно решение solid, которое извлекает все пути, начинающиеся с "/ Home «и заканчиваем» /Specs".

Я пробовал следующий шаблон:

pat <- ".*(/Home/.*/Specs).*"

И следующие функции:

str_match_all(miserie,pat)
gsub(x=miserie, pattern=pat, replace="\\1")

Первый вернул это результат:

[[1]]
     [,1]                                                                                                                     
[1,] "some text /Home/123/home-name/Specs some other text http://www.example.com/Speccs some other text /Home/456/home-name/Specs"
     [,2]                       
[1,] "/Home/456/home-name/Specs"

А второй вернул только последний URL:

[1] "/Home/456/home-name/Specs"

Есть предложения?

Ответы [ 2 ]

3 голосов
/ 09 февраля 2020

Мы можем попробовать использовать gregexpr и regmatches со следующим шаблоном регулярных выражений:

(?<!\\S)/Home(/[^/\\s]+)*/Specs

Пример сценария:

miserie <- "some text /Home/123/home-name/Specs some other text http://www.example.com/Specs some other text /Home/456/home-name/Specs"
regmatches(miserie, gregexpr("(?<!\\S)/Home(/[^/\\s]+)*/Specs", miserie, perl=TRUE))

[[1]]
[1] "/Home/123/home-name/Specs" "/Home/456/home-name/Specs"

Вот объяснение того, как шаблон регулярного выражения используется:

(?<!\\S)       assert that what precedes is either whitespace or
               the start of the string
/Home          match /Home
(/[^/\\s]+)*   optionally match zero or more other components
/Specs         ending in Specs
2 голосов
/ 09 февраля 2020

Вы можете использовать:

stringr::str_match_all(miserie,".*?(/Home/.*?/Specs).*?")[[1]][,2]
#[1] "/Home/123/home-name/Specs" "/Home/456/home-name/Specs"

Использование ? позволяет сделать шаблон ленивым, сопоставляя как можно меньше символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...