精确找到n次模式后的Grep

时间:2019-09-02 09:55:33

标签: r regex

我正在寻找一个正则表达式来捕获字符串,其中该字符串被重复 n 次。这是预期输出的示例。

# find sentences with 2 occurrences of the word "is"
z = c("this is what it is and is not", "this is not", "this is it it is")
regex_function(z)
[1] FALSE FALSE  TRUE  

我已经走了这么远:

grepl("(.*\\bis\\b.*){2}",z)
[1] TRUE FALSE  TRUE   

但是如果至少有 2个匹配项,它将返回TRUE。如何强制它查找恰好有2次出现的字符串?

4 个答案:

答案 0 :(得分:1)

要查找单词is包含两次的位置,可以将所有isgsub删除,并比较字符串的长度与nchar

nchar(z) - nchar(gsub("(\\bis\\b)", "", z)) == 4
#[1] FALSE FALSE  TRUE

或计算gregexpr的点击次数,例如:

sapply(gregexpr("\\bis\\b", z), function(x) sum(x>0)) == 2
#[1] FALSE FALSE  TRUE

或在regex中带有grepl

grepl("^(?!(.*\\bis\\b){3})(.*\\bis\\b){2}.*$", z, perl=TRUE)
#[1] FALSE FALSE  TRUE

答案 1 :(得分:0)

这是一个有效的选项,但需要进行2个regex呼叫。我仍在寻找一个紧凑的regex通话,可以正确解决此问题。

grepl("(.*\\bis\\b.*){2}",z) & !grepl("(.*\\bis\\b.*){3}",z)  

基本上添加n + 1的grepl,仅保留满足grep no 1和不满足grep no2的那些。

答案 2 :(得分:0)

library(stringi)
stri_count_regex(z, "\\bis\\b") == 2L
# [1] FALSE FALSE  TRUE

答案 3 :(得分:0)

stringr

library(stringr)
library(magrittr)

regex_function = function(str){
  str_extract_all(str,"\\bis\\b")%>%
    lapply(.,function(x){length(x) == 2}) %>%
    unlist()
}

> regex_function(z)
[1] FALSE FALSE  TRUE