2011-12-23 9 views
28

Ho una stringa di caratteri e cosa estrarre le informazioni all'interno di più parentesi. Attualmente posso estrarre le informazioni dall'ultima parentesi con il codice qui sotto. Come dovrei farlo in modo che estrae più parentesi e ritorni come un vettore?Informazioni di estrazione all'interno di tutte le parentesi in R

j <- "What kind of cheese isn't your cheese? (wonder) Nacho cheese! (groan) (Laugh)"               
sub("\\).*", "", sub(".*\\(", "", j)) 

Uscita in corrente è:

[1] "Laugh" 

output desiderato è:

[1] "wonder" "groan" "Laugh" 

risposta

30

Ecco un esempio:

> gsub("[\\(\\)]", "", regmatches(j, gregexpr("\\(.*?\\)", j))[[1]]) 
[1] "wonder" "groan" "Laugh" 

credo che questo dovrebbe funzionare bene:

> regmatches(j, gregexpr("(?=\\().*?(?<=\\))", j, perl=T))[[1]] 
[1] "(wonder)" "(groan)" "(Laugh)" 

ma i risultati includono parentesi ... perché?

Questo funziona:

regmatches(j, gregexpr("(?<=\\().*?(?=\\))", j, perl=T))[[1]] 

Grazie @MartinMorgan per il commento.

+1

NOTA: Questo funziona per un vettore, ma non funziona per il testo in una colonna di un frame di dati. – AudileF

13

Utilizzando il pacchetto stringr possiamo ridurlo leggermente.

library(stringr) 
# Get the parenthesis and what is inside 
k <- str_extract_all(j, "\\([^()]+\\)")[[1]] 
# Remove parenthesis 
k <- substring(k, 2, nchar(k)-1) 

@kohske utilizza regmatches ma Attualmente sto usando 2.13 in modo da non avere accesso a tale funzione in questo momento. Questo aggiunge la dipendenza stringr ma penso che sia un po 'più facile da lavorare e il codice è un po' più chiaro (beh ... più chiaro utilizzando le espressioni regolari può essere ...)

Edit: potremmo anche prova qualcosa del genere -

re <- "\\(([^()]+)\\)" 
gsub(re, "\\1", str_extract_all(j, re)[[1]]) 

Questo funziona definendo una sottoespressione marcata all'interno dell'espressione regolare. Estrae tutto ciò che corrisponde alla regex e quindi gsub estrae solo la parte all'interno della sottoespressione.

3

L'utilizzo di rex può semplificare questo tipo di attività.

matches <- re_matches(j, 
    rex(
    "(", 
    capture(name = "text", except_any_of(")")), 
    ")"), 
    global = TRUE) 

matches[[1]]$text 
#>[1] "wonder" "groan" "Laugh" 
Problemi correlati