2015-03-10 20 views
6

Due domande correlate. Ho vettori di dati di testo qualiEstrai il testo tra parentesi in R

"a(b)jk(p)" "ipq" "e(ijkl)" 

e voglio separare facilmente in un vettore contenente il testo fuori dalle parentesi:

"ajk" "ipq" "e" 

e un vettore contenente il testo all'interno delle parentesi:

"bp" "" "ijkl" 

C'è un modo semplice per farlo? Una difficoltà aggiunta è che questi possono diventare piuttosto grandi e avere un numero (illimitato) di parentesi. Quindi, non posso semplicemente afferrare il testo "pre/post" tra parentesi e ho bisogno di una soluzione più intelligente.

+1

Questo post potrebbe essere utile: http://stackoverflow.com/questions/8613237/extract-info-inside-all-parenthesis-in-r-regex –

risposta

10

testo al di fuori la parentesi

> x <- c("a(b)jk(p)" ,"ipq" , "e(ijkl)") 
> gsub("\\([^()]*\\)", "", x) 
[1] "ajk" "ipq" "e" 

testo all'interno delle parentesi

> x <- c("a(b)jk(p)" ,"ipq" , "e(ijkl)") 
> gsub("(?<=\\()[^()]*(?=\\))(*SKIP)(*F)|.", "", x, perl=T) 
[1] "bp" ""  "ijkl" 

I (?<=\\()[^()]*(?=\\)) partite tutti i personaggi che sono presenti all'interno delle parentesi e poi il seguente (*SKIP)(*F) fa la partita fallire. Ora tenta di eseguire il modello che era appena dopo il simbolo | rispetto alla stringa rimanente. Quindi il punto . corrisponde a tutti i caratteri che non sono già saltati. Sostituendo tutti i personaggi abbinati con una stringa vuota si darà solo il testo presente all'interno delle racchette.

> gsub("\\(([^()]*)\\)|.", "\\1", x, perl=T) 
[1] "bp" ""  "ijkl" 

Questa espressione regolare sarebbe di catturare tutti i personaggi che sono presenti all'interno delle parentesi e corrisponde a tutti gli altri personaggi. o parte aiuta a far corrispondere tutti i caratteri rimanenti diversi da quelli catturati. Quindi, sostituendo tutti i caratteri con i caratteri presenti all'interno dell'indice di gruppo 1, otterrai l'output desiderato.

+0

lo farei assumere accidentale come un downvote non ha senso. L'estrazione è stata interessante perché hai estratto e messo insieme senza "incollare". +1 –

+0

@TylerRinker sì, qualcuno si è arrabbiato con me e così ha messo 4 voti bassi nella mia risposta che ha un punteggio minimo di 1. Il mio male. –

+0

@TylerRinker è possibile fornire il collegamento al pacchetto qdapRegex? –

5

La funzione rm_round nel qdapRegex package mantengo nato per fare questo:

Prima ci arriveremo e caricare il pacchetto tramite pacman

if (!require("pacman")) install.packages("pacman") 
pacman::p_load(qdapRegex) 

## Allora possiamo usarlo per rimuovere ed estrarre le parti desiderate:

x <-c("a(b)jk(p)", "ipq", "e(ijkl)") 

rm_round(x) 

## [1] "ajk" "ipq" "e" 

rm_round(x, extract=TRUE) 

## [[1]] 
## [1] "b" "p" 
## 
## [[2]] 
## [1] NA 
## 
## [[3]] 
## [1] "ijkl" 

Per condensare b e p uso:

sapply(rm_round(x, extract=TRUE), paste, collapse="") 

## [1] "bp" "NA" "ijkl" 
+0

'regmatches (x, gregexpr (" (? <= \\(). +? (? = \\)) ", x, perl = TRUE))' per una versione 'regmatches' in base, con' regmatches (x, gregexpr ("(? <= \\) | ^). +? (? = \\ (| $)", x, perl = TRUE)) 'per il contrario. – thelatemail

+0

@thelatemail che merita la sua risposta. –

Problemi correlati