2014-06-16 168 views
4

看起来grep在返回匹配的方式中是“贪婪”的。假设我有以下数据:R 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"

+0

只需使用''==然后,如果你想完全匹配:'$ DF来源[DF $来源== “燃煤电厂”]' – thelatemail

+0

@thelatemail这将在这方面的工作实例。但想象一下,如果我还有其他条目,如“煤电蒸汽机厂”,“柴油机厂”等,我也想回复这些。 – sedeh

+0

这真的不是同一个问题。如果你在这个问题上改变people.jpg来表示人们,然后做一个你在寻找人的grep,它会以“人民”的身份回归事件。您可以运行下面看看我说的话:'X < - C( “imageUploaded,人民更,逗号分隔,东西”, “imageUploaded”, “people.jpg” ) xmatches < - 相交( ) x [xmatches]' – sedeh

回答

7

你想用字边界\b在你的字图案原来的尝试。字边界不消耗任何字符。它断言,一方面有一个字的字,另一方面则没有。您可能还想考虑使用内联(?i)修饰符进行不区分大小写的匹配。

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

Working Demo

+0

这很好。谢谢。 – sedeh

+0

刚刚检查过它。当你有新手时,会发生这种情况。 – sedeh

+0

我注意到,如果我向源添加了“煤油炉”,然后尝试修改grep函数以查找“煤油”,则该函数发生故障。这是否意味着这个功能不能有两个以上的条件? grep('(?i)(?=。* \\ bplant \\ b)|(?=。* \\ bcoal \\ b)|(?=。* \\ kerosene \\ b)',df $来源,perl = T,值= T)' – sedeh

2

如果你总是希望令“煤炭”,然后“植物”,那么这应该工作

grep("\\b[Cc]oal\\b.*\\b[Pp]lant\\b", Sources, perl = TRUE, value=T) 

这里我们添加\b匹配它代表一个单词边界。您可以添加单词边界,我们也

grep("(?=.*\\b[Pp]lant\\b)(?=.*\\b[Cc]oal\\b)", Sources, 
    perl = TRUE, value = TRUE) 
+0

第二个选项是固定的,顺序无关紧要。谢谢。 – sedeh