看起来grep在返回匹配项方面是“贪婪的”。假设我有以下数据:

Sources <- c(
                "Coal burning plant",
                "General plant",
                "coalescent plantation",
                "Charcoal burning plant"
        )

Registry <- seq(from = 1100, to = 1103, by = 1)

df <- data.frame(Registry, Sources)

如果执行grep("(?=.*[Pp]lant)(?=.*[Cc]oal)", df$Sources, perl = TRUE, value = TRUE),它将返回
"Coal burning plant"
"coalescent plantation"
"Charcoal burning plant"

但是,我只想返回完全匹配的内容,即仅在出现“煤”和“植物”的地方。我不希望“聚结”,“种植”等。所以为此,我只想看"Coal burning plant"

最佳答案

您想在单词模式周围使用单词边界\b。单词边界不占用任何字符。它断言,一侧有文字字符,而另一侧没有文字字符。您可能还需要考虑使用内联(?i)修饰符进行不区分大小写的匹配。

grep('(?i)(?=.*\\bplant\\b)(?=.*\\bcoal\\b)', df$Sources, perl=T, value=T)

Working Demo

10-06 09:07