Соответствует каждому после второго вхождения слова - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть строка в R, и я хотел бы сопоставить все после 2-го вхождения слова, используя регулярное выражение

Пример: вернуть все после 2-го вхождения is

"This is a string of example. this is what i should get in return".

Ожидаемый результат

what i should get in return

Я пробовал что-то вроде ([^is]+)(?:is[^is]+){2}$, но это не работает.

Спасибо.

Ответы [ 3 ]

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

Используя пакет stringr, вы можете использовать str_locate_all() с str_sub(). Это извлекает, где второй экземпляр ([2,) из s в "is" ([, 2]). И добавляет один (+ 1), чтобы он начинал один символ справа от места, где заканчивается "is".

str_sub(text, str_locate_all(text, "\\bis\\b")[[1]][2, 2] + 1)
[1] " what i should get in return"

Данные :

text <- "This is a string of example. this is what i should get in return"
1 голос
/ 25 февраля 2020

Вы можете использовать шаблон PCRE, например

^(?>.*?\sis\s+){2}\K.*

См. Демонстрационную версию regex

Подробности

  • ^ - начало строки
  • (?>.*?\\sis\\s+){2} - группа атомов c, соответствующая двум вхождениям:
    • .* - любые 0+ символов, кроме символов разрыва строки, как максимально возможное количество
    • \s - пробел
    • is - слово is
    • \s+ - 1+ пробелов
  • \K - оператор сброса совпадений
  • .* - остаток строки.

R demo :

x <- "This is a string of example. this is what i should get in return"
regmatches(x, regexpr("^(?>.*?\\sis\\s+){2}\\K.*", x, perl=TRUE))
## => [1] "what i should get in return"

С stringr:

stringr::str_match(x, "^(?>.*?\\sis\\s+){2}(.*)")[,2]
0 голосов
/ 26 февраля 2020

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

txt <- "This is a string of example. this is what i should get in return"

library(unglue)
unglue_vec(txt, "{=.*?} is {=.*?} is {x}")
#> [1] "what i should get in return"

Создано в 2020-02-26 пакетом prex (v0.3.0)

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