【问题标题】:Consecutive character matching and extraction with position带位置的连续字符匹配和提取
【发布时间】:2018-10-09 17:45:15
【问题描述】:

我正在尝试在 R 中编写一个通用代码,在其中以特定顺序在向量中连续查找 2 个(或更多)显式字符。我尝试的每个命令都只会返回第一个字符的匹配项。

我有一个看起来与数据相似的字符串,我想提取“L”和“V”仅按该顺序相邻的位置。所以我唯一的匹配应该是位置 3 & 4 和 7 & 8;但是,我将返回位置 1、3 和 7 作为 L 的匹配项。是否可以只返回“LV”匹配项?

可重复使用的数据:

data <- c("L", "D", "L", "V", "A", "V", "L", "V")

【问题讨论】:

    标签: r pattern-matching regex-lookarounds grepl


    【解决方案1】:

    这里有一些可能性:

    which(ts(data) == "L" & stats::lag(ts(data)) == "V")
    ## [1] 3 7
    
    which(head(data, -1) == "L" & tail(data, -1) == "V")
    ## [1] 3 7
    
    which(apply(t(embed(data, 2)) == c("V", "L"), 2, all))
    ## [1] 3 7
    
    which(data == "L" & dplyr::lead(data) == "V")
    ## [1] 3 7
    

    【讨论】:

      【解决方案2】:

      向量data 可以先用paste 折叠成一个字符串。然后我们可以通过gregexpr找到起始位置。之后,我们可以通过将gregexpr 的结果与调整后的匹配长度属性连接起来,形成一个起点和终点的列表。

      x <- gregexpr("LV", paste(data, collapse = ""))[[1]]
      Map(c, x, x + attr(x, "match.length") - 1)
      # [[1]]
      # [1] 3 4
      #
      # [[2]]
      # [1] 7 8
      

      【讨论】:

        猜你喜欢
        • 2019-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-11
        • 2011-12-28
        • 2021-07-24
        相关资源
        最近更新 更多