使用grepl匹配某些单词,但只能在不得出现其他单词的特定上下文中使用

时间:2019-08-15 13:46:52

标签: r regex-lookarounds grepl

假设这是我的数据...

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

......我将如何使用grepl匹配其中出现“书”但没有“不好”的行(即第1和第3行,而不是第2行)?

我尝试了类似的操作,但负前瞻性...

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

...但是那没有用,因为它也与第二行匹配。我认为这是因为一旦检测到“书”,它就会返回“ TRUE”,而不必担心是否会同时发生“不良”事件。

编辑:只是将其添加为一个条件:我对字符串的具体结构以及bookbad的位置一无所知,但让我们假设{{ 1}}首先。例如:book(s)

2 个答案:

答案 0 :(得分:2)

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

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

这可以确保在检查bad之前mydata$text中没有books

答案 1 :(得分:1)

一个更简单的选择是

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