web-dev-qa-db-fra.com

Extraire une chaîne entre deux autres chaînes dans R

J'essaie de trouver un moyen simple d'extraire une sous-chaîne inconnue (pouvant être n'importe quoi) qui apparaît entre deux sous-chaînes connues. Par exemple, j'ai une chaîne:

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

J'ai besoin d'extraire la chaîne GET_ME qui se situe entre STR1 et STR2 (sans les espaces blancs).

J'essaie str_extract(a, "STR1 (.+) STR2"), mais j'obtiens tout le match 

[1] "STR1 GET_ME STR2"

Je peux bien sûr effacer les chaînes connues pour isoler la sous-chaîne dont j'ai besoin, mais je pense qu'il devrait exister une méthode plus propre pour le faire en utilisant une expression régulière correcte. 

16
Sasha

Vous pouvez utiliser str_match avec STR1 (.*?) STR2 (notez que les espaces sont "significatifs", si vous souhaitez simplement faire correspondre n'importe quoi entre STR1 et STR2, utilisez STR1(.*?)STR2). Si vous avez plusieurs occurrences, utilisez 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"

Une autre manière d’utiliser la base R regexec (pour obtenir le premier match):

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"
32
Wiktor Stribiżew

Voici un autre moyen d'utiliser la base R

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

gsub(".*STR1 (.+) STR2.*", "\\1", a)

Sortie:

[1] "GET_ME"
1