Zwei verwandte Fragen. Ich habe Vektoren von Textdaten wie
"a(b)jk(p)" "ipq" "e(ijkl)"
und möchten es einfach in einen Vektor trennen, der den Text AUSSERHALB der Klammern enthält:
"ajk" "ipq" "e"
und einen Vektor, der den Text IN den Klammern enthält:
"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. Daher kann ich nicht einfach Text "vor / nach" in Klammern abrufen und benötige eine intelligentere Lösung.
Text außerhalb der Klammer
> x <- c("a(b)jk(p)" ,"ipq" , "e(ijkl)")
> gsub("\\([^()]*\\)", "", x)
[1] "ajk" "ipq" "e"
Text in Klammern
> x <- c("a(b)jk(p)" ,"ipq" , "e(ijkl)")
> gsub("(?<=\\()[^()]*(?=\\))(*SKIP)(*F)|.", "", x, perl=T)
[1] "bp" "" "ijkl"
Das (?<=\\()[^()]*(?=\\))
stimmt mit allen Zeichen überein, die in den Klammern vorhanden sind, und im Folgenden (*SKIP)(*F)
schlägt die Übereinstimmung fehl. Jetzt wird versucht, das Muster auszuführen, das unmittelbar nach dem |
Symbol für die verbleibende Zeichenfolge war. Der Punkt .
entspricht also allen Zeichen, die noch nicht übersprungen wurden. Wenn Sie alle übereinstimmenden Zeichen durch eine leere Zeichenfolge ersetzen, wird nur der Text in den Schlägern 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 ein Teil hilft dabei, alle verbleibenden Charaktere außer den erfassten zu finden. Wenn Sie also alle Zeichen durch die Zeichen im Gruppenindex 1 ersetzen, erhalten Sie die gewünschte Ausgabe.
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen