使用 grepl 来匹配某些词,但仅限于其他词不能出现的特定上下文

Use grepl to match certain words but only in specific contexts where other words must not occur

假设这是我的数据...

mydata<-data.frame(text=c("There are books.","Books are bad.", "I like to read books."))

...我如何使用 grepl 匹配出现 "book(s)" 但 "bad" 不出现的行(即第 1 行和第 3 行,但不是第 2 行)?

我尝试过类似的事情,并带有负面的前瞻性...

grepl("book(s)?.*?(?!\bbad\b)", mydata$text, perl=T, ignore.case=T)

...但这不起作用,因为它也匹配第二行。我认为这是因为一旦 "book(s)" 被检测到,它 returns "TRUE" 并且不会担心 "bad" 是否同时出现。

编辑:只是将其添加为条件:我对字符串的具体结构以及 books 和 bads 的位置一无所知,但我们假设book(s) 先来。示例:"there are plenty of books, all of which are bad, but some I really like.".

一个更简单的选择是

grepl('book(s)?', mydata$text) & !grepl('\bbad\b', mydata$text)

使用负前瞻,我们可以做到

grepl("^(?!.*bad).*books.*$", mydata$text, perl = TRUE)
#[1]  TRUE FALSE  TRUE

这确保在检查 books 之前 bad 不存在于 mydata$text 中。