假设这是我的数据...
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”,而不必担心是否会同时发生“不良”事件。
编辑:只是将其添加为一个条件:我对字符串的具体结构以及book
和bad
的位置一无所知,但让我们假设{{ 1}}首先。例如:book(s)
。
答案 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)