有什么方法可以用 grepl 要求两次匹配而不是一次匹配吗?

Any way to require two matches instead of just one for TRUE with grepl?

我正在尝试使用 grepl 检测术语,但出现了太多误报。我希望可能有一种方法可以要求列表中任何术语的两次成功匹配(我对我的一段数据进行了手动编码,并试图让自动化至少大致对应于此,但我有大约 5是我手动编码时正面次数的两倍)。我没有看到 grepl 接受任何需要多个匹配才能触发 TRUE 的参数。是否有任何方法需要两次匹配才能触发 TRUE 发现?或者还有其他我应该使用的功能吗?

GenericColumn <- cbind(grepl(Genericpattern, Statement$Statement.Text, ignore.case = TRUE))

编辑:

这是一个更具体的例子:

Examplepattern <- 'apple|orange'
ExampleColumn <- cbind(grepl(Examplepattern, Rexample$Statement.Text, ignore.case = TRUE)) 

和现在一样,所有这些都将通过 grepl 触发 true。我只希望有两个引用的项目触发 true。

示例数据:

Rexample <- structure(list(Statement.Text = structure(c(2L, 1L, 3L, 5L, 4L
), .Label = c("This apple is a test about an apple.", "This is a test about apples.", 
"This orange is a test about apples.", "This orange is a test about oranges.", 
"This orange is a test."), class = "factor")), .Names = "Statement.Text", row.names = c(NA, 
5L), class = "data.frame")

期望的输出:真、假、真、真、假

您可以再次尝试使用显式查找模式的正则表达式,例如 (?:apple|orange).*(?:apple|orange)

(pattern <- paste0("(?:", Examplepattern, ")", ".*", "(?:", Examplepattern, ")"))
#[1] "(?:apple|orange).*(?:apple|orange)"


grepl(pattern, Rexample$Statement.Text, ignore.case = TRUE, perl = TRUE)
#[1] FALSE  TRUE  TRUE FALSE  TRUE

您可以使用花括号指定您希望在正则表达式中重复某些内容的次数,例如 {2}(恰好是它之前的两倍)、{2,5}(2-5 次)或 {2,}(2次或更多次)。但是,您需要在要匹配的单词之间留出单词,因此您需要使用 *(0 次或更多次)量化的通配符 .

因此,如果您希望 appleorange 匹配两次(包括 appleorange,反之亦然),您可以使用

grepl('(apple.*|orange.*){2}', Rexample$Statement.Text, ignore.case = TRUE)
# [1] FALSE  TRUE  TRUE FALSE  TRUE

如果要apple重复两次或orange重复两次(但不是apple一次和orange一次),分别量化:

grepl('(apple.*){2,}|(orange.*){2}', Rexample$Statement.Text, ignore.case = TRUE)
# [1] FALSE  TRUE FALSE FALSE  TRUE