我正在寻找一个正则表达式来捕获字符串,其中该字符串被重复 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次出现的字符串?
答案 0 :(得分:1)
要查找单词is
包含两次的位置,可以将所有is
与gsub
删除,并比较字符串的长度与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