我试图使用stringr和rebus来构建模式到子集串。字符串我想得到一些共同点,它们都以相同的数字开头和结尾。示例数据位置15和22显示了我想要子集的内容。这些数字可以在1到120之间变化。
这是我认为可行的(我知道我没有声明他们必须相同,我不知道如何):
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 :(得分: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"
您也可以将最后一个捕获组(\\d+)
限制为1到120之间的指定数字范围,方法是将其替换为([1-120])
。
答案 1 :(得分:0)
我看到我回答得太晚了,我不确定在这里收到的信息如何,但是正如Manuel指出的那样,您想要使用的是捕获组,正如他在regex中显示的那样。但是,如果您决心使用rebus,则只需添加一个捕获功能和一个引用即可:
START %R% capture(one_or_more(DGT)) %R% one_or_more(ANY_CHAR) %R% REF1 %R% END
如您所见,capture()
正在抓取1个或多个数字,并期望它们紧跟一定数量的字符,紧随其后。希望我能帮助别人,这是我在本网站上的第一个答案。