在R中使用grepl()来匹配句子中的两个连续单词(或:如何在grepl()中使用通配符)?

时间:2019-07-13 17:07:12

标签: r 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”。

现在,考虑到我可以简单地搜索“像小说。*?”,这可能是一个不好的例子。第一个单词没有通配符,但是进一步假设我也需要在两个单词中的第一个使用通配符。

并与之相关:如何匹配句子中的单词,并在单词中间加上通配符?

示例:

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)

1 个答案:

答案 0 :(得分:1)

如果单词是连续的

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”,后跟单词边界({{1} })