2017-07-26 3 views
0

Ich habe einen regulären Ausdruck, der meine Daten mit grepl abgleichen kann, aber ich kann nicht herausfinden, wie die darin enthaltenen Unterausdrücke in neue Spalten extrahiert werden .Extrahieren von Unterausdrücken aus einem Datenrahmen von Zeichenfolgen mit regulären Ausdrücken

Dies kehrt die Test-String als foo, ohne dass einer der Teilausdrücke:

entryPattern <- "(\\d+)\\s+([[:lower:][:blank:]-]*[A-Z][[:alpha:][:blank:]-]+[A-Z]\\s[[:alpha:][:blank:]]+)\\s+([A-Z]{3})\\s+(\\d{4})\\s+(\\d\\d\\-\\d\\d)\\s+([[:print:][:blank:]]+)\\s+(\\d*\\:?\\d+\\.\\d+)" 
test <- "101  POULET Laure        FRA  1992 25-29  E. M. S. Bron Natation   26.00" 
m <- regexpr(entryPattern, test) 
foo <- regmatches(test, m) 

In meinem realen Anwendungsfall, ich bin auf vielen Saiten ähnlich wie test wirken. Ich kann die korrekt formatierten finden, daher denke ich, dass das Muster korrekt ist.

rows$isMatch <- grepl(entryPattern, rows$text) 

Was zu tun ‚Hoffnung, M ist die Unterausdrücke als neue Spalten in den Reihen Datenrahmen hinzufügen (d rows$rank, rows$name, rows$country, etc.). Vielen Dank im Voraus für eine Beratung.

Antwort

0

Es scheint, dass regmatches nicht tun, was ich will. Stattdessen brauche ich das Stringr-Paket, wie suggested von @ Kent-Johnson.

library(stringr) 
test <- "101  POULET Laure        FRA  1992 25-29  E. M. S. Bron Natation   26.00" 
entryPattern <- "(\\d+)\\s+([[:lower:][:blank:]-]*[A-Z][[:alpha:][:blank:]-]+[A-Z]\\s[[:alpha:][:blank:]]+?)\\s+([A-Z]{3})\\s+(\\d{4})\\s+(\\d\\d\\-\\d\\d)\\s+([[:print:][:blank:]]+?)\\s+(\\d*\\:?\\d+\\.\\d+)" 
str_match(test, entryPattern)[1,2:8] 

Welche Ausgänge:

[1] "101"        
[2] "POULET Laure"     
[3] "FRA"        
[4] "1992"       
[5] "25-29"       
[6] "E. M. S. Bron Natation" 
[7] "26.00" 
Verwandte Themen