2015-03-10 15 views
6

extrahieren Zwei verwandte Fragen. Ich habe Vektoren von Textdaten wieText in Klammern in R

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

und wollen diese leicht in einen Vektor trennen den Text außerhalb der Klammern enthalten:

"ajk" "ipq" "e" 

und einen Vektor, den Text in den Klammern enthalten:

"bp" "" "ijkl" 

Gibt es eine einfache Möglichkeit, dies zu tun? Eine zusätzliche Schwierigkeit besteht darin, dass diese ziemlich groß werden können und eine große (unbegrenzte) Anzahl von Klammern haben. So kann ich nicht einfach Text "vor/nach" den Klammern greifen und brauche eine intelligentere Lösung.

+1

Dieser Beitrag nützlich sein könnten: http://stackoverflow.com/questions/8613237/extract-info-inside-all-parenthesis-in-r-regex –

Antwort

10

Text außerhalb der Klammer

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

Text in der Klammer

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

Die (?<=\\()[^()]*(?=\\)) Matches alle Zeichen, die in den Klammern vorhanden sind, und dann die folgende (*SKIP)(*F) macht das Spiel Versagen. Jetzt versucht es, das Muster, das gerade nach | Symbol gegen die verbleibende Zeichenfolge war, auszuführen. Der Punkt . stimmt also mit allen Zeichen überein, die noch nicht übersprungen wurden. Wenn Sie alle übereinstimmenden Zeichen durch eine leere Zeichenfolge ersetzen, wird nur der Text in den Rackets angezeigt.

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

Diese Regex würde alle Zeichen erfassen, die in den Klammern vorhanden sind und mit allen anderen Zeichen übereinstimmen. oder Teil hilft, alle verbleibenden Zeichen außer den gefangenen Zeichen zu entsprechen. Wenn Sie also alle Zeichen durch die Zeichen ersetzen, die in der Gruppe vorhanden sind, gibt Ihnen Index 1 die gewünschte Ausgabe.

+0

würde ich nehmen Sie es zufällig an, da ein Downvote keinen Sinn ergibt. Die Extraktion war cool, weil Sie extrahiert und zusammengesetzt ohne "Paste". +1 –

+0

@TylerRinker Yep, jemand wurde wütend auf mich und so legte er 4 downvotes auf meine Antwort, die eine Mindestpunktzahl von 1 hat. Meine schlechte. –

+0

@TylerRinker könnten Sie den Link zum qdapRegex-Paket bereitstellen? –

5

Die rm_round Funktion im qdapRegex package Ich war geboren halten, dies zu tun:

Zuerst haben wir das Paket über pacman bekommen und laden werden

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

## Dann können wir es verwenden, zum Entfernen und Extrahieren der gewünschten Teile:

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" 

kondensieren b und p Verwendung:

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

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

'regmatches (x, gregexpr (" (? <= \\(). +? (? = \\)) ", x, perl = TRUE))' für eine 'regmatches'-Version in der Basis, mit' regmatches (x, gregexpr ("(? <= \\) | ^). +? (? = \\ (| $)", x, perl = WAHR)) 'für das Gegenteil. – thelatemail

+0

@thelatemail Das verdient eine eigene Antwort. –

Verwandte Themen