找到连续匹配的模式索引

时间:2018-01-13 12:12:33

标签: r grep stringr

我想在某些字符串中找到匹配模式的所有索引。例如,我有一个字符串x <- "1110001101",我希望将其与"11"匹配,结果应该是c(1, 2, 7),但是,我只能得到2 1}} ...

  • 方法1:使用gregexpr

    x
    [1] "1110001101"
    
    gregexpr(pattern = "11", x)
    [[1]]
    [1] 1 7 # Why isn't there a 2?
    attr(,"match.length")
    [1] 2 2
    attr(,"useBytes")
    [1] TRUE
    
  • 方法2:使用包str_locate_all

    中的stringr
    library(stringr)
    str_locate_all(pattern = "11", x)
    [[1]]
         start end
    [1,]     1   2
    [2,]     7   8 # Why still isn't there a 2?
    

我是否为这些功能丢失了一些微妙的论据?感谢您的建议!

1 个答案:

答案 0 :(得分:3)

我们可以使用正则表达式的外观,即正面的正则表达式前瞻,以匹配一个字符后跟两个1来给出匹配开头的位置gregexpr

as.integer(gregexpr("(?=11)", x, perl = TRUE)[[1]])
#[1] 1 2 7

或者str_locate正则表达式(在这种情况下减去1)

stringr::str_locate_all(x, "(?<=11)")[[1]][,2]-1
#[1] 1 2 7

或正则表达式预测

stringr::str_locate_all(x, "(?=11)")[[1]][,1]
#[1] 1 2 7

这种方法与OP的区别在于,使用OP的方法,一旦匹配,它会跳过该部分并寻找下一个匹配。如果我们查看另一个字符串

,可以更好地解释这一点
x1 <- "11110001101"
str_locate_all(pattern = "11", x1)
#[[1]]
#      start end
#[1,]     1   2
#[2,]     3   4
#[3,]     8   9

使用正则表达式查看,将有4场比赛

as.integer(gregexpr("(?=11)", x1, perl = TRUE)[[1]])
#[1] 1 2 3 8