webentwicklung-frage-antwort-db.com.de

Extrahieren einer Zeichenfolge zwischen zwei anderen Zeichenfolgen in R

Ich versuche einen einfachen Weg zu finden, um einen unbekannten Teilstring (der alles sein könnte) zu extrahieren, der zwischen zwei bekannten Teilstrings erscheint. Zum Beispiel habe ich eine Zeichenfolge:

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

Ich muss den String GET_ME extrahieren, der sich zwischen STR1 und STR2 (ohne die Leerzeichen) befindet.

Ich versuche str_extract(a, "STR1 (.+) STR2"), aber ich bekomme das ganze Spiel 

[1] "STR1 GET_ME STR2"

Ich kann natürlich die bekannten Strings entfernen, um den benötigten Teilstring zu isolieren, aber ich denke, es sollte einen saubereren Weg geben, indem man einen korrekten regulären Ausdruck verwendet. 

16
Sasha

Sie können str_match mit STR1 (.*?) STR2 verwenden (beachten Sie, dass die Leerzeichen "sinnvoll" sind, wenn Sie etwas zwischen STR1 und STR2 verwenden möchten, verwenden Sie STR1(.*?)STR2). Wenn Sie mehrere Vorkommen haben, verwenden Sie 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"

Eine andere Möglichkeit, die Basis R regexec zu verwenden (um die erste Übereinstimmung zu erhalten):

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

Eine andere Option ist die Verwendung von qdapRegex::ex_between, um Zeichenfolgen zwischen der linken und rechten Begrenzung zu extrahieren

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

Es funktioniert auch mit mehreren Vorkommen

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"

Oder mehrere linke und rechte Grenzen

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"

Die erste Aufnahme erfolgt zwischen "STR1" und "STR2", die zweite zwischen "STR4" und "STR5".

1
Ronak Shah

Hier ist ein anderer Weg, indem Sie Basis R verwenden

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

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

Ausgabe:

[1] "GET_ME"