【问题标题】:R subset strings with stringr and rebus带有 stringr 和 rebus 的 R 子集字符串
【发布时间】:2017-12-27 11:05:37
【问题描述】:

我正在尝试使用 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"
)

【问题讨论】:

    标签: r stringr


    【解决方案1】:

    如果它不必是rebusstringr,您可以将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])

    【讨论】:

    • 让我为我的示例更新几个字符串,这会给我带来问题。如您所见,有一些奇怪的日期/时间。会用这个,因为它也会选择正确的。
    • 您可以在第一个数字捕获组之后引入一个空白 \\s 以排除时间模式(因为在后者中,第一个数字后跟冒号而不是空白)如下 "(^)(\\d+)(\\s)(.+)(\\d+)($)"
    【解决方案2】:

    我知道我很晚才回答这个问题,我不确定这里是如何收到的,但正如 Manuel 指出的那样,你想要使用的是一个捕获组,正如他在正则表达式中所展示的那样。但是,如果您致力于使用 rebus,您需要做的就是添加一个捕获函数和一个引用:

    START %R% capture(one_or_more(DGT)) %R% one_or_more(ANY_CHAR) %R% REF1 %R% END
    

    如您所见,capture() 正在抓取 1 个或多个数字,并期望它们出现在一定数量的字符之后,紧接着是结尾。我希望我能帮助别人,这是我在这个网站上的第一个答案。

    【讨论】:

      猜你喜欢
      • 2022-11-13
      • 1970-01-01
      • 2015-12-11
      • 2015-07-09
      • 1970-01-01
      • 1970-01-01
      • 2018-07-04
      • 2019-02-14
      • 1970-01-01
      相关资源
      最近更新 更多