使用 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" 是否同时出现。
编辑:只是将其添加为条件:我对字符串的具体结构以及 book
s 和 bad
s 的位置一无所知,但我们假设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
中。
假设这是我的数据...
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" 是否同时出现。
编辑:只是将其添加为条件:我对字符串的具体结构以及 book
s 和 bad
s 的位置一无所知,但我们假设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
中。