Extrahieren date aus gegebenen string in r

string<-c("Posted 69 months ago (7/4/2011)")
library(gsubfn)
strapplyc(string, "(.*)", simplify = TRUE)

Ich gelten obige Funktion, aber es passiert nichts.

In diese möchte ich extrahieren einzige Tag, Teil ich.e 7/4/2011.

InformationsquelleAutor Avinash | 2017-04-14



3 Replies
  1. 9

    Die erste zeigt, wie man den code in die Frage zu geben, die gewünschte Antwort. Die nächsten 2 Lösungen sind die gleichen, außer Sie verwenden verschiedene reguläre Ausdrücke. Die vierte Lösung zeigt, wie es zu tun mit gsub. Der fünfte bricht die gsub in zwei sub Anrufe und die sechste verwendet read.table.

    1) Flucht parens Das problem ist, dass ( und ) haben eine Besondere Bedeutung in regulären Ausdrücken, so müssen Sie fliehen Sie, wenn Sie möchten, passen Sie an, buchstäblich. Durch die Verwendung "[(]" wie wir unten (oder schreibt Sie als "\\(" ) abgestimmt wahrsten Sinne des Wortes. Die inneren Klammern definieren Sie die capture-Gruppe, da wir nicht möchten, dass Gruppe gehören die literalen Klammern sich:

    strapplyc(string, "[(](.*)[)]", simplify = TRUE)
    ## [1] "7/4/2011"

    2) Übereinstimmung Inhalt Anderen Weg, es zu tun ist, um die übereinstimmung der Daten selbst, anstatt die umgebenden Klammern. Hier "\\d+" entspricht einer oder mehreren Ziffern:

    strapplyc(string, "\\d+/\\d+/\\d+", simplify = TRUE)
    ## [1] "7/4/2011"

    Könnten Sie die Anzahl der Ziffern, wenn Sie möchten, um noch genauer zu sein, aber es scheint hier überflüssig, wenn die Daten ähnlich sieht, dass in der Frage.

    3) Spiel 8 oder mehr Ziffern und Schrägstriche Gegeben, dass es keine anderen Sequenzen, die mit 8 oder mehr Zeichen besteht nur aus der Schrägstriche und Ziffern in den rest der Zeichenkette könnten wir nur herausgreifen, dass:

    strapplyc(string, "[0-9/]{8,}", simplify = TRUE)
    ## [1] "7/4/2011"

    4) Entfernen Sie text vor und nach Anderen Weg, es zu tun, ist das entfernen alles bis zu den ( und nach dem ) wie folgt:

    gsub(".*[(]|[)].*", "", string)
    ## [1] "7/4/2011"

    5) sub das ist das gleiche wie (4), außer es bricht der gsub in zwei sub Anrufungen, eine Beseitigung alles ( und die anderen entfernen ) ab. Die regulären Ausdrücke sind daher etwas einfacher.

    sub(".*\\(", "", sub("\\).*", "", string))

    6) zu Lesen.Tabelle Diese Lösung benutzt keine regulären Ausdrücke überhaupt. Es definiert sep und comment.char im read.table so, dass die zweite Spalte des Ergebnisses der read.table ist das erforderliche Datum oder die Daten.

    read.table(text = string, sep = "(", comment.char = ")", as.is = TRUE)$V2
    ## [1] "7/4/2011"

    Hinweis: Beachten Sie, dass Sie nicht brauchen, die c bei der Festlegung string

    string <- c("Posted 69 months ago (7/4/2011)")
    string2 <- "Posted 69 months ago (7/4/2011)"
    identical(string, string2)
    ## [1] TRUE
    • Keine Ahnung, warum es bekam downvoted. Nette Optionen.
    • hervorragende Vielzahl von Optionen, danke für die ausführliche Antwort
  2. 4

    Diesem match wird ein Datum in der form „nn/nn/nnnn“ oder „n/n/nnnn“, und ersetzen Sie alles, was vor und nach. Die Klammern bedeuten, dass eine capture-Klasse und haben nichts zu tun mit dem parens in Sie die Zeichenfolge ein, die nicht dem Muster entsprechen und werden verworfen.:

     gsub( ".*(\\d{1,2}/\\d{1,2}/\\d{4}).*", "\\1", string)
    "[1] "7/4/2011"

    Des Quantifizierer-Klausel „{1,2}“ entspricht einer beliebigen Muster, die unmittelbar vor es ein oder zwei mal. In diesem Fall ist es passenden Ziffern. Es gibt keine Bestätigung, dass es ein Datum. Für die, die Sie brauchen würde:

     as.Date( gsub( ".*(\\d{1,2}/\\d{1,2}/\\d{4}).*", "\\1", string) , format="%m/%d/%Y")
    #[1] "2011-07-04"

    Lesen Sie die details in:

    ?regex
  3. 3

    Dies können wir mit gsub durch passende ein oder mehrere Zeichen, die nicht ( ([^(]+) von Anfang an (^) der string-oder | die ) am Ende ($) der Zeichenfolge und ersetzen Sie es mit ""

    gsub("[^[^(]+\\(|\\)$", "", string)
    #[1] "7/4/2011"

    Oder mit capture-Gruppen

    sub("^[^(]+\\(([^)]+).*", "\\1", string)
    #[1] "7/4/2011"

    Oder mit str_extract wir mit ein oder mehrere Zeichen, die nicht ein ) ([^)]+) folgt, dass die ( ((?<=[(]))

    library(stringr)
    str_extract(string, "(?<=[(])[^)]+")
    #[1] "7/4/2011"

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.