2014-04-07 16 views
6

Ich versuche, stringr Paket zu verwenden, um einen Teil einer Zeichenfolge zu extrahieren, die zwischen zwei bestimmten Mustern ist.Teil der Zeichenfolge zwischen zwei verschiedenen Mustern extrahieren

Zum Beispiel habe ich:

my.string <- "nanaqwertybaba" 
left.border <- "nana" 
right.border <- "baba" 

und durch die Verwendung von str_extract(string, pattern) Funktion (wo Muster von einem POSIX regulären Ausdruck definiert ist) Ich mag würde erhalten:

"qwerty" 

Lösungen von Google haben nicht funktioniert.

Antwort

8

Ich weiß nicht, ob und wie diese mit Funktionen von stringr bereitgestellt möglich ist aber auch Basis regexpr und substring verwenden:

pattern <- paste0("(?<=", left.border, ")[a-z]+(?=", right.border, ")") 
# "(?<=nana)[a-z]+(?=baba)" 

rx <- regexpr(pattern, text=my.string, perl=TRUE) 
# [1] 5 
# attr(,"match.length") 
# [1] 6 

substring(my.string, rx, rx+attr(rx, "match.length")-1) 
# [1] "qwerty" 
+0

Danke, sigbb! Ich habe es gerade ein wenig angepasst, um: 1. alle Zeichen zwischen "left.border" und "right.border" zu finden, 2. bis zum ersten Vorkommen von 'right.border' zu passen und jetzt habe ich:' rx <- regexpr (paste0 ("(? <=", linksbündig, ") (. *?) + (? =", right.border, ")"), text = my.string, perl = TRUE) '. Großes Dankeschön an dich! –

14

In base R können Sie gsub verwenden. Die Klammern in pattern erstellen nummerierte Erfassungsgruppen. Hier wählen wir die zweite Gruppe in der replacement, d. H. Die Gruppe zwischen den Grenzen. Die . entspricht einem beliebigen Zeichen. Die * bedeutet, dass es keine oder mehrere der vorstehenden Element

gsub(pattern = "(.*nana)(.*)(baba.*)", 
    replacement = "\\2", 
    x = "xxxnanaRisnicebabayyy") 
# "Risnice" 
+0

Nun, der Punkt ist, ich weiß nicht, dass "QWERTY" hier sitzt, gibt es keine Möglichkeit, ich verwende es im Regex-Muster! –

+0

@Marciszka: Sie können "QWERTY" in diesem Beispiel durch einen regulären Ausdruck ersetzen, z. 'gsub (pattern =" (. * nana) ([[: alpha:]] +) (baba. *) "," \\ 2 ", x = mein.string)' für mindestens einen Buchstaben. – sgibb

5

I str_match von stringr verwenden würde: „str_match extrahiert capture Gruppen gebildet durch () von dem ersten Spiel Es gibt eine Zeichenmatrix mit. eine Spalte für die vollständige Übereinstimmung und eine Spalte für jede Gruppe. "

ref
str_match(my.string, paste(left.border, '(.+)', right.border, sep=''))[,2] 

Der obige Code erzeugt einen regulären Ausdruck mit paste die Einfanggruppe (.+) verketten, die mit 1 oder mehr Zeichen einfängt, mit dem linken und rechten Rand (keine Zwischenräume zwischen den Zeichenketten).

Eine einzelne Übereinstimmung wird angenommen. So wählt [,2] die zweite Spalte aus der Matrix, die von str_match zurückgegeben wird.

Verwandte Themen