2014-10-07 2 views
11

Ich möchte einen Strsplit-Befehl schreiben, der das erste ")" ergreift und die Zeichenfolge aufteilt.R: strsplit auf der ersten Instanz

Zum Beispiel:

f("12)34)56") 
"12" "34)56" 

ich über mehrere andere verwandte regex SO Fragen gelesen haben, aber ich fürchte, ich bin nicht fähig Kopf oder Zahl davon zu machen. Danke jede Hilfe.

Antwort

10

Sie könnten das gleiche Liste-Typ Ergebnis erhalten, wie Sie es mit strsplit wenn Sie regexpr verwendet um die erste Übereinstimmung zu erhalten, und dann das invertierte Ergebnis von regmatches.

x <- "12)34)56" 
regmatches(x, regexpr(")", x), invert = TRUE) 
# [[1]] 
# [1] "12" "34)56" 
2

Ersetzen Sie die erste ( durch das nicht druckbare Zeichen "\01" und dann strsplit darauf. Sie können jedes beliebige Zeichen anstelle von "\01" verwenden, solange es nicht angezeigt wird.

strsplit(sub(")", "\01", "12)34)56"), "\01") 
+0

Durch den Vorschlag, aber das ist gefährlich, weil im allgemeinen könnte es ein Komma vor dem ')' wie 'strsplit (sub (")" sein,“, "", 12) 34) 56"), ",") '. – fsmart

+0

Siehe die Revision. –

2

Eine weitere Option ist str_split im Paket stringr zu verwenden: Geschwindigkeit

library(stringr) 
f <- function(string) 
{ 
    unlist(str_split(string,"\\)",n=2)) 
} 
> f("12)34)56") 
[1] "12" "34)56" 
4

nötig? Dann gehen Sie für Funktionen. Siehe Zeiten, z.B. here.

library(stringi) 
x <- "12)34)56" 
stri_split_fixed(str = x, pattern = ")", n = 2) 
5

Es könnte sicherer sein, zu erkennen, wo der Charakter ist und dann auf beiden Seiten davon String:

x <- "12)34)56" 
spl <- regexpr(")",x) 
substring(x,c(1,spl+1),c(spl-1,nchar(x))) 
#[1] "12" "34)56"