2014-06-16 206 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