2012-11-21 27 views

risposta

29

Preferisco usare gsub() per questo:

gsub(".*\\((.*)\\).*", "\\1", df) 
[1] "id-1290" 

L'espressione regolare funziona così:

  • trovare del testo all'interno delle parentesi - non i vostri veri parentesi, ma la mia ulteriore set di parentesi, ovvero (.*)
  • Restituire come riferimento, \\1

In altre parole, sostituire tutto il testo nella stringa con il riferimento posteriore


Se si desidera utilizzare regexp piuttosto che gsub, quindi fare questo:

x <- regexpr("\\((.*)\\)", df) 
x 

[1] 11 
attr(,"match.length") 
[1] 9 
attr(,"useBytes") 
[1] TRUE 

Questo restituisce una valore di 11, ovvero la posizione iniziale dell'espressione trovata. E nota l'attributo match.length che indica quanti caratteri sono stati abbinati.

È possibile estrarre questo con attr:

attr(x, "match.length") 
[1] 9 

e quindi utilizzare substring per estrarre i personaggi:

substring(df, x+1, x+attr(x, "match.length")-2) 
[1] "id-1290" 
2

Ecco un modo leggermente diverso, utilizzando lookbehind/avanti:

df <- "Peoplesoft(id-1290)" 
regmatches(df,gregexpr("(?<=\\().*?(?=\\))", df, perl=TRUE)) 

La differenza con la risposta di Andrie è che anche questo orchi per estrarre più stringhe tra parentesi. per esempio.:

df <- "Peoplesoft(id-1290) blabla (foo)" 
regmatches(df,gregexpr("(?<=\\().*?(?=\\))", df, perl=TRUE)) 

Dà:

[[1]] 
[1] "id-1290" "foo" 
Problemi correlati