在 R 中使用 grepl() 匹配句子中的两个连续单词(或:How to use wildcards in grepl())?

Using grepl() in R to match two consecutive words in a sentence (or: How to use wildcards in grepl())?

假设我想匹配一个句子中的两个连续词,但明确不匹配可能仍然包含这两个词但不是一个接一个地出现的其他句子。

mydata <- data.frame(text=c("I like pizza, and a read a novel.", "I like novels."))

所以,如果我这样做...

grepl("lik.*? novel.*?", mydata$text, perl=T, ignore.case=T)

...我得到“[1] TRUE TRUE”,而我需要的是 "FALSE TRUE",因为第一句中的 "like" 没有引用 "novel"。

现在,这可能是一个糟糕的例子,因为我可以简单地搜索 "Like novel.*?" 而不是第一个单词的通配符,但进一步假设我需要对两个单词中的第一个使用这个通配符单词也是。

与此相关:如何将句子中的单词与所述单词中间的通配符相匹配?

示例:

mydata<-data.frame(text=c("xxx abc xxx", "xxx azc xxx", "xxx a bc xxx"))

我想匹配以 "a" 开头并以 "c" 结尾的单词,无论中间是什么,但条件是这必须是一个单词。目前,即使是第三行,我也得到了 "TRUE",而我需要的是前两行的匹配,而不是第三行的匹配:

grepl("a.*?c", mydata$text, perl=T, ignore.case=T)

如果单词是连续的

grepl("like\b \bnovel", mydata$text, perl=TRUE, ignore.case=TRUE)
#[1] FALSE  TRUE

对于第二种情况,我们可以在

的开头和结尾使用词边界(\b)
grepl("\ba\w+c\b", mydata$text, perl = TRUE, ignore.case = TRUE)
#[1]  TRUE  TRUE FALSE

此处要匹配的模式是单词边界 (\b) 后跟字符 'a'、一个或多个字符 (\w+) 和 'c' 后跟单词边界 (\b)