Если у вас просто есть вектор строк (изолированный или в виде столбца в data.frame
), то, возможно:
s <- c("hello world illness quux bar not action illness",
"not an illness", "no positive", "illness", "illness goodbye")
ret <- lapply(list(gregexpr("(\\S+)(?= illness)", s, perl = TRUE),
gregexpr("(?<=illness )(\\S+)", s, perl = TRUE)),
regmatches, x = s)
Map(c, ret[[1]], ret[[2]])
# [[1]]
# [1] "world" "action" "quux"
# [[2]]
# [1] "an"
# [[3]]
# character(0)
# [[4]]
# character(0)
# [[5]]
# [1] "goodbye"
Каждый gregexpr
находит слово (ну, непрерывный непробельный пробел) ) сопровождается литералом " illness"
или предшествует литералу "illness "
. Поскольку он возвращает list
с достаточным количеством информации для извлечения подстрок из оригинала, мы используем regmatches(x=s, ...)
для извлечения компонентов.
(Команда Map
имеет дело с тем фактом, что результат lapply
это список длиной 2, по одному для каждого регулярного выражения. Он просто объединяет подстроки из первого регулярного выражения с подстроками из второго регулярного выражения, "архивируя" совпадения для каждой строки в векторе. Если вы посмотрите на ret[[1]]
и / или ret
в целом, польза от этого может иметь больше смысла.)
Если вас не волнует , в какой строке в векторе / столбце найдены окружающие слова, тогда вы можете просто удалить это:
unlist(ret)
# [1] "world" "action" "an" "quux" "goodbye"