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?
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?
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:
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)
library(stringr)
str_extract(test, '\\d.\\d+')
#[1] "3.24"
Einfach ein
gsub("\\$", "", test)
Wenn Sie nur über Zahlen betroffen sind, dann können Sie
verwendengsub("\\$(\\d+(?:\\.\\d+)?)", "\\1", test)
Wenn Sie ()
auch entfernen möchten, dann
gsub("\\(\\$(\\d+(?:\\.\\d+)?)\\)", "\\1", test)
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
@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). –