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.
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"
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".
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"