2016-04-21 19 views
0

Ich habe diese Eingabezeichen: ($3.24) Ich möchte bekommen 3.24 Ich habe versucht:gsub R Extrakt numerisch aus string

test <- c("($3.24)") 
aa <- gsub("[0-9]+\\.?[0-9]+", '\\1', test) 

Was ist der Ersatz ist \\1 für?

+1

verwenden sie nicht alles tun, da es keine Capture-Gruppe in 'pattern' ist. Ändern Sie Ihren Code leicht in 'gsub (" ([0-9] + \\.? [0-9] +) |. ", '\\ 1', test)' wird das gewünschte Ergebnis geben – rawr

+1

@rawr: Genau mein Ansatz für einen ähnlichen Notepad ++ [Frage] (http://stackoverflow.com/questions/36696455/regex-removing-anyything-that-is-not-a14-digit-number-followed-with-space/36763298# 36763298). Passen Sie an, was Sie nicht brauchen, und passen Sie an und * erfassen *, was Sie behalten müssen. [Der beste Regex-Trick aller Zeiten] (http://www.rexegg.com/regex-best-trick.html#thetrick). –

Antwort

2

Der Ausdruck \\1 Mittel, was im regulären Ausdruck in der ersten Capture-Gruppe war verwenden. Eine Erfassungsgruppe wird durch eine Schließung definiert (Klammern), aber da Sie nichts Bedeutungsvolles definiert haben, erhalten Sie nicht das gewünschte Ergebnis.

ist die korrekte Verwendung von gsub() zu bekommen, was man wollte:

> gsub("\\(\\$([0-9]+\\.+[0-9]+)\\)", "\\1", "($3.24)") 
[1] "3.24" 

Der reguläre Ausdruck verwendet wird, ist hier:

\(\$([0-9]+\.+[0-9]+)\) 

Die Capture-Gruppe([0-9]+\.+[0-9]+) ist, das ist alles kommend zwischen ($ und der schließenden Klammer ), die eine Zahl ist, die möglicherweise einen einzigen Dezimalpunkt enthält. Mit gsub() wird dann test mit was auch immer Capture, in diesem Fall 3.24 ersetzt.

können Sie diesen regulären Ausdruck erforschen hier:

Regex101

0

Sie können es mit Hilfe der Funktion extract_numeric aus Paket tidyr tun.

library(tidyr) 
test <- c("($3.24)") 
extract_numeric(test) 
[1] 3.24 

Blick in den Code von extract_numeric gibt uns, dass es eine einfache Wrapper für gsub ist.

function (x) 
{ 
    as.numeric(gsub("[^0-9.-]+", "", as.character(x))) 
} 

So zum aktuellen Beispiel können Sie reguläre Ausdrücke

gsub("[^0-9.-]+", "", test) 
+0

Das funktioniert! Gibt es jedoch eine Lösung, die reguläre Ausdrücke verwendet? – noblabla

+0

Ich habe meine Antwort bearbeitet – inscaven

0
library(stringr) 
str_extract(test, '\\d.\\d+') 
#[1] "3.24" 
0

Einfach ein

gsub("\\$", "", test) 

Wenn Sie nur über Zahlen betroffen sind, dann können Sie

verwenden
gsub("\\$(\\d+(?:\\.\\d+)?)", "\\1", test) 

Wenn Sie () auch entfernen möchten, dann

gsub("\\(\\$(\\d+(?:\\.\\d+)?)\\)", "\\1", test)