2013-03-21 12 views
5

YARQ (Noch eine Regex Frage).Split Spalte nach dem letzten Wort im Satz

Wie würde ich das folgende in zwei Spalten aufteilen, sicherstellen, dass die letzte Spalte das letzte Wort im Satz enthält und die erste Spalte alles andere enthält.

x <- c("This is a test", 
     "Testing 1,2,3 Hello", 
     "Foo Bar", 
     "Random 214274(%*(^(* Sample", 
     "Some Hyphenated-Thing" 
     ) 

so, dass ich am Ende mit:

col1       col2 
this is a     test 
Testing 1,2,3    Hello 
Foo       Bar 
Random 214274(%*(^(*   Sample 
Some       Hyphenated-Thing 

Antwort

9

Das sieht nach einem Job für Look Ahead aus. Wir werden Räume finden, denen Dinge folgen, die keine Räume sind.

split <- strsplit(x, " (?=[^ ]+$)", perl=TRUE) 
matrix(unlist(split), ncol=2, byrow=TRUE) 

    [,1]     [,2]    
[1,] "This is a"   "test"    
[2,] "Testing 1,2,3"  "Hello"   
[3,] "Foo"     "Bar"    
[4,] "Random 214274(%*(^(*" "Sample"   
[5,] "Some"     "Hyphenated-Thing" 
+0

+1 und Häkchen für Geschwindigkeit (rep (10k) = 0.05 s) –

1

Unter der Annahme, „Worte“ alphanumerisches ist (das letzte Wort ist in diesem Fall eine oder Buchstaben \\w oder Ziffern \\d, können Sie weitere Klassen hinzufügen, wenn nötig):

col_one = gsub("(.*)(\\b[[\\w\\d]+)$", "\\1", x, perl=TRUE) 
col_two = gsub("(.*)(\\b[[\\w\\d]+)$", "\\2", x, perl=TRUE) 

Ausgang:

> col_one 
[1] "This is a "   "Testing 1,2,3 "  "Foo "     
[4] "Random 214274(%*(^(* " 
> col_two 
[1] "test" "Hello" "Bar" "Sample" 
+0

Das scheint zu funktionieren, aber wenn das letzte "Wort" ein '-' darin hat, wird es nicht berücksichtigt. Ich aktualisiere mein Beispiel. –

+0

Das war es, was ich mit meiner Erklärung versuchen wollte: Ich war mir nicht sicher, was genau in den Worten sein könnte, also benutzte ich '\\ w \\ d'. Du solltest besser diesen Teil mit '\\ S' ersetzen: jedes Zeichen, das kein Leerzeichen ist. – Marius

+0

Das Ersetzen von '\\ W \\ d' mit' \\ S' funktionierte nicht für mich. Dies funktioniert mit Ausnahme von getrennten Endwörtern. –

4

hier ein Gos mit strsplit:

do.call(rbind, 
    lapply(
    strsplit(x," "), 
    function(y) 
     cbind(paste(head(y,length(y)-1),collapse=" "),tail(y,1)) 
    ) 
) 

Oder eine alternative Implementierung mit sapply

t(
    sapply(
    strsplit(x," "), 
    function(y) cbind(paste(head(y,length(y)-1),collapse=" "),tail(y,1)) 
) 
) 

in Resultierende:

 [,1]     [,2]    
[1,] "This is a"   "test"    
[2,] "Testing 1,2,3"  "Hello"   
[3,] "Foo"     "Bar"    
[4,] "Random 214274(%*(^(*" "Sample"   
[5,] "Some"     "Hyphenated-Thing" 
+0

+1 voll funktionsfähig. –

0

Dies könnte nicht genau für Sie sein, aber falls jemand frage mich , wie diese in Python zu tun:

#col1: 
print line.split(" ")[:-1] 

#col2: 
print line.split(" ")[-1] 

Beachten Sie, dass col1 als Liste ausgedruckt werden erhalten, die Sie in eine Zeichenfolge wie folgt machen:

#col1: 
print " ".join(line.split(" ")[:-1])