2017-12-27 145 views
0

我正在嘗試使用stringr和rebus來構建子串串的模式。我想獲得的絃樂有一些共同之處,它們都以相同的數字開始和結束。示例數據位置15和22顯示了我想要子集的內容。這些數字可以從1到120帶子串和rebus的R子串字符串

以下是我認爲將工作(我知道,我不是做陳述,他們必須是相同的,我不知道如何):

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) 

什麼是我正在尋找的正確模式?加上開始和結束是完全一樣的,因爲這應該使它萬無一失。

數據:

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" 
) 

回答

0

如果它沒有被rebus,按照下圖stringr你可以使用grep用正則表達式(正則表達式)。這有幫助嗎?

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" 

您也可以通過由([1-120])替換它限制最後捕獲組(\\d+)爲數字的指定範圍從1到120。

+0

讓我更新幾個字符串到我的例子,這會導致我的問題。正如你所看到的,有一些奇怪的日期/時間。將與此一起,因爲它也會選擇正確的。 – Viitama

+0

您可能會在第一個數字捕獲組之後引入一個空白'\\ s'來排除時間模式(因爲在後面的第一個數字後面跟着冒號而不是空白),如下所示:「(^)(\\ d + )(\\ S)(+)(\\ d +)($)「' –