Извлеките строку слов между двумя конкретными словами в R

У меня есть следующая строка: "PRODUCT colgate good but not goodOKAY"

Я хочу извлечь все слова между PRODUCT и OKAY

Ответ 1

Это можно сделать с помощью sub:

s <- "PRODUCT colgate good but not goodOKAY"
sub(".*PRODUCT *(.*?) *OKAY.*", "\\1", s)

даяние:

[1] "colgate good but not good"

Нет пакетов.

Вот визуализация регулярного выражения:

.*PRODUCT *(.*?) *OKAY.*

Regular expression visualization

Демоверсия Debuggex

Ответ 2

x = "PRODUCT colgate good but not goodOKAY"
library(stringr)
str_extract(string = x, pattern = perl("(?<=PRODUCT).*(?=OKAY)"))

(?<=PRODUCT) - посмотрите за спину за PRODUCT

.* соответствует всем, кроме новых строк.

(?=OKAY) - посмотрите вперед, чтобы соответствовать OKAY.

Я должен добавить, что для этого вам не нужен пакет stingr, базовые функции sub и gsub работают нормально. Я использую stringr для согласованности синтаксиса: я извлекаю, заменяю, обнаруживаю и т.д. Имена функций предсказуемы и понятны, а аргументы находятся в последовательном порядке. Я использую stringr, потому что это избавляет меня от необходимости обращаться к документации каждый раз.

Ответ 3

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

vec <- "PRODUCT colgate good but not goodOKAY"

gsub(".*PRODUCT\\s*|OKAY.*", "", vec)
# [1] "colgate good but not good"

Ответ 4

Вы можете использовать функцию rm_between из пакета qdapRegex. Он берет строку и левую и правую границы следующим образом:

x <- "PRODUCT colgate good but not goodOKAY"

library(qdapRegex)
rm_between(x, "PRODUCT", "OKAY", extract=TRUE)

## [[1]]
## [1] "colgate good but not good"

Ответ 5

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

library(unglue)
x <- "PRODUCT colgate good but not goodOKAY"
unglue_vec(x, "PRODUCT {out}OKAY")
#> [1] "colgate good but not good"