2017-12-27 4 views
0

Ich versuche, Stringr und Rebus zu verwenden, um Muster zu Subset Bundle von Strings zu erstellen. Saiten, die ich gerne etwas gemeinsam haben möchte, beginnen und enden alle mit der gleichen Ziffer. Die Beispieldatenpositionen 15 und 22 zeigen, was ich gerne unterteilen möchte. Diese Zahlen von 1 bis 120R Subset-Strings mit Stringr und Rebus

Hier variieren kann, ist, was ich dachte funktionieren würde (ich weiß, dass ich nicht Aussage mache, dass sie gleich sein, weiß ich nicht, wie man):

library(stringr) 
library(rebus) 

pattern <- START %R% one_or_more(DGT) %R% one_or_more(ANY_CHAR) %R% one_or_more(DGT) %R% END 

str_subset(example, pattern) 

Was ist das richtige Muster, das ich suche? Plus für das Starten und das Ende, um genau dasselbe zu sein, weil das es idiotensicher machen sollte.

Daten:

example <- c("10. - 15. JAN 2017", "COMPETITION ANALYSIS", 
"WOMEN 7.5 KM SPRINT", "CHIEMGAU ARENA", "SAT 14 JAN 2017", "START TIME:", 
"END TIME:", "14:30", "15:47", "Rank Bib Name Nat T", "Loop1 Loop2 Loop3", 
"Result Behind Rank", "Time Behind Rank Time Behind Rank Time Behind Rank", 
"1 43 MAKARAINEN Kaisa FIN 0 20:51.8 0.0 1", "Cumulative Time 7:15.7 0.0 1 14:32.2 0.0 1 20:51.8 0.0 1", 
"Loop Time 7:15.7 0.0 1 7:16.5 0.0 1 6:19.6 0.0 1", "Shooting 0 33.0 +12.0 =41 0 30.0 +8.0 =42 0 1:03.0 +19.0 =48", 
"Range Time 55.5 +11.9 =35 51.9 +7.5 37 1:47.4 +18.5 38", "Course Time 6:14.5 0.0 1 6:19.9 0.0 1 6:19.6 0.0 1 18:54.0 0.0 1", 
"Penalty Time 5.7 4.7 10.4", "2 64 KOUKALOVA Gabriela CZE 0 21:13.8 +22.0 2", 
"Cumulative Time 7:24.6 +8.9 3 14:45.4 +13.2 2 21:13.8 +22.0 2" 
) 

Antwort

0

Wenn es nicht rebus sein muss und stringr könnten Sie grep mit regex (regular expression) verwenden, wie unten dargestellt. Hilft das?

example[grepl("(^)(\\d+)(.+)(\\d+)($)", example, perl = T)] 
# [1] "1 30 HORCHLER Nadine GER 0 36:11.5 0.0 1" 
# [2] "2 1 DAHLMEIER Laura GER 3 36:14.6 +3.1 2" 

Sie können auch die letzte Erfassungsgruppe (\\d+) an den angegebenen Zahlenbereich von 1 bis 120, indem sie es durch ([1-120]) ersetzt beschränken.

+0

Lassen Sie mich einige Strings zu meinem Beispiel aktualisieren, die mir Probleme bereiten. Wie Sie sehen können, gibt es einige seltsame Daten/Zeiten. Wird damit gehen, da es auch richtige abholen wird. – Viitama

+0

Sie können ein einzelnes leeres '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 'nach der ersten Zifferneinfanggruppe einführen, um Zeitmuster auszuschließen (da in letzterer die ersten Ziffern von einem Doppelpunkt gefolgt werden)' (^) (\\ d +)) (\\ s) (. +) (\\ d +) ($) "' –

Verwandte Themen