2014-04-07 12 views
6

Provo ad utilizzare il pacchetto stringr per estrarre parte di una stringa, che si trova tra due modelli particolari.Estrai parte della stringa tra due diversi motivi

Ad esempio, ho:

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

e dall'uso di str_extract(string, pattern) funzione (dove modello è definito da una POSIX espressioni regolari) Desidero ricevere:

"qwerty" 

Le soluzioni di Google non hanno funzionato.

risposta

8

Non so se e come questo è possibile con funzioni fornite dal stringr ma è anche possibile utilizzare di base regexpr e substring:

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

Grazie, sigbb! L'ho appena regolato un po ', in modo da: 1. Abbinare tutti i caratteri tra 'left.border' e' right.border', 2. abbinare alla prima occorrenza di 'right.border' e ora ho:' rx <- regexpr (paste0 ("(? <=", left.border, ") (. *?) + (? =", right.border, ")"), text = my.string, perl = TRUE) '. Grazie mille a te! –

14

In base R è possibile utilizzare gsub. Le parentesi nel gruppo pattern creano gruppi di cattura numerati. Qui selezioniamo il secondo gruppo nello replacement, ovvero il gruppo tra i bordi. Il . corrisponde a qualsiasi carattere. Il * significa che v'è zero o più dell'elemento precedente

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

Bene, il punto è che non so che "qwerty" siediti qui, non c'è modo di usarlo nel modello regex! –

+0

@Marciszka: è possibile sostituire "qwerty" in questo esempio con un'espressione regolare, ad es. 'gsub (pattern =" (. * nana) ([[: alpha:]] +) (baba. *) "," \\ 2 ", x = my.string)' per almeno una lettera. – sgibb

5

userei str_match da stringr: "str_match estrae gruppi Capture formati da () dalla prima corrispondenza che restituisce una matrice di caratteri con. una colonna per la corrispondenza completa e una colonna per ciascun gruppo. " ref

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

Il codice di cui sopra crea un'espressione regolare con paste concatenando il gruppo di cattura (.+) che cattura 1 o più personaggi, con i bordi sinistro e destro (senza spazi tra le stringhe).

Si presuppone una corrispondenza singola. Quindi, [,2] seleziona la seconda colonna dalla matrice restituita da str_match.