regex r stringr

regex - Extraer una cadena entre otras dos cadenas en R



stringr (3)

Estoy tratando de encontrar una manera simple de extraer una subcadena desconocida (podría ser cualquier cosa) que aparezca entre dos subcadenas conocidas. Por ejemplo, tengo una cadena:

a<-" anything goes here, STR1 GET_ME STR2, anything goes here"

Necesito extraer la cadena GET_ME que está entre STR1 y STR2 (sin los espacios en blanco).

Estoy intentando str_extract(a, "STR1 (.+) STR2") , pero str_extract(a, "STR1 (.+) STR2") la coincidencia completa

[1] "STR1 GET_ME STR2"

Por supuesto, puedo quitar las cadenas conocidas para aislar la subcadena que necesito, pero creo que debería haber una forma más limpia de hacerlo utilizando una expresión regular correcta.


Aquí hay otra forma usando la base R

a<-" anything goes here, STR1 GET_ME STR2, anything goes here" gsub(".*STR1 (.+) STR2.*", "//1", a)

Salida:

[1] "GET_ME"


Otra opción es usar qdapRegex::ex_between para extraer cadenas entre los límites izquierdo y derecho

qdapRegex::ex_between(a, "STR1", "STR2")[[1]] #[1] "GET_ME"

También funciona con múltiples ocurrencias

a <- "anything STR1 GET_ME STR2, anything goes here, STR1 again get me STR2" qdapRegex::ex_between(a, "STR1", "STR2")[[1]] #[1] "GET_ME" "again get me"

O múltiples límites izquierdo y derecho

a <- "anything STR1 GET_ME STR2, anything goes here, STR4 again get me STR5" qdapRegex::ex_between(a, c("STR1", "STR4"), c("STR2", "STR5"))[[1]] #[1] "GET_ME" "again get me"

La primera captura es entre "STR1" y "STR2", mientras que la segunda es entre "STR4" y "STR5".


Puede usar str_match con STR1 (.*?) STR2 (tenga en cuenta que los espacios son "significativos", si desea hacer coincidir cualquier cosa entre STR1 y STR2 use STR1(.*?)STR2 ). Si tiene múltiples ocurrencias, use str_match_all .

library(stringr) a<-" anything goes here, STR1 GET_ME STR2, anything goes here" res <- str_match(a, "STR1 (.*?) STR2") res[,2] [1] "GET_ME"

Otra forma de usar la base R regexec (para obtener la primera coincidencia):

test = " anything goes here, STR1 GET_ME STR2, anything goes here STR1 GET_ME2 STR2" pattern="STR1 (.*?) STR2" result <- regmatches(test,regexec(pattern,test)) result[[1]][2] [1] "GET_ME"