Как удалить сегмент строки с конкретным началом и концом в R, используя регулярные выражения?

У меня есть строка.

str = c("F14 : M114L","W15 : M116L, W15 : M118L","W15 : D111L, F14 : E112L, F14 : M116L")

Цель состоит в том, чтобы удалить что-либо между: и L (также включает в себя пробел прямо перед:), чтобы в итоге я имел

"F14", "W15, W15", "W15, F14, F14"

Я думаю, используя

gsub(" : [[:alnum:]]L", "", str)

Но это явно не работает. Не знаю, есть ли что-то вроде шаблона, который может представлять любое количество цифр и символов между: и L.

Ответ 1

Это будет сделано:

gsub(" : .*?L", "", str)
#[1] "F14"           "W15, W15"      "W15, F14, F14"

Ответ 2

Вы можете легко сделать это с помощью пакета qdapRegex, который я поддерживаю:

str = c("F14 : M114L","W15 : M116L, W15 : M118L","W15 : D111L, F14 : E112L, F14 : M116L")

library(qdapRegex)
rm_between(str, "\\s:", "L")
## [1] "F14"           "W15, W15"      "W15, F14, F14"

qdapRegex стремится быть полезным, как он учит. Если вас интересует регулярное выражение, используемое...

S("@rm_between", "\\s:", "L")
## [1] "(\\s:)(.*?)(L)"

gsub(S("@rm_between", "\\s:", "L") , "", str)

Ответ 3

Пара подходов.

Возьмите первые несколько букв, если они всегда три:

substr(str,1,3)

Мне лично нравится stringr тоже. Это делает добычу очень простой. Выбирайте то, что хотите, а не то, что вы не хотите.

library(stringr)
str_extract(str,"[A-Z][0-9]*")

Я упростил их для вектора, но у вас есть вспомогательные элементы, вам понадобится что-то вроде:

splits <- strsplit(str,", ")
result <- lapply(splits, substr, start = 1, stop = 3 )

или

result <- lapply(splits, str_extract, pattern = "[A-Z][0-9]*")