俗話說(shuō),“獨(dú)學(xué)而無(wú)友,則孤陋而寡聞”。
為了方便大家交流學(xué)習(xí),共同進(jìn)步,我特地創(chuàng)建了?生信交流群?
廢話不多說(shuō),我們來(lái)聊聊今天的正題。昨天有位群友在群里提出了這樣一個(gè)問(wèn)題

具體的字符串向量是這樣的,需要達(dá)到的目的就是,看字符串向量里面的每一個(gè)元素是否包含"LIPE2"這個(gè)基因。這里的字符串向量有四個(gè)元素。

實(shí)現(xiàn)的手段就是通過(guò)R的grepl函數(shù)

這個(gè)函數(shù)里的pattern是匹配的模式,也就是我們經(jīng)常聽(tīng)到的正則表達(dá)式。如果對(duì)正則表達(dá)式還不了解的小伙伴,可以參考?正則表達(dá)式?。x就是要查看是否滿(mǎn)足pattern的字符串向量,如果匹配pattern就返回TRUE,不滿(mǎn)足就返回FASLE。

這位群友所提出的問(wèn)題,tricky的地方在于LIPE2這個(gè)基因有時(shí)候存在于字符串的中間,有時(shí)候存在于開(kāi)頭,有時(shí)候又存在于末尾,并且還需要考慮一些干擾項(xiàng)比如LIPE23這個(gè)基因也能夠匹配LIPE2,似乎很難通過(guò)一個(gè)正則表達(dá)式來(lái)實(shí)現(xiàn)。后來(lái)這位群友自己解決了這個(gè)問(wèn)題,方法就是通過(guò)或來(lái)實(shí)現(xiàn)。既然一個(gè)正則表達(dá)式無(wú)法滿(mǎn)足需要,那就多寫(xiě)幾個(gè)正則表達(dá)式,把所有可能的情況都考慮進(jìn)去。

這個(gè)問(wèn)題引起了群里關(guān)于正則表達(dá)式激烈的討論,

其實(shí),在這個(gè)群友提出這個(gè)問(wèn)題之前,我還不太確定,pattern里面可以使用或(|),通過(guò)討論大家都有所收獲,至少群里的其他小伙伴知道了正則表達(dá)式這個(gè)概念。以后遇到相似的問(wèn)題,也知道怎么解決了。
今天我又仔細(xì)的研究了一下,給出了三種實(shí)現(xiàn)的方法,供大家交流學(xué)習(xí)。我又加入了一個(gè)干擾項(xiàng),讓這個(gè)正則表達(dá)式更全面。
s <- c("ABCLIPE2", #LIPE2前面有干擾
"LIPE-AS1,LIPE,CXCL17",
"LIPE-AS1,LIPE2,LIPE,CXCL17", #LIPE2在中間,前后都有,
"LIPE2", #LIPE2在字符串的開(kāi)始,或者結(jié)尾
"LIPE23") #LIPE2后面有干擾
方法一,直接匹配所有可能的情況
#^LIPE2$:匹配整個(gè)字符串只有LIPE2這個(gè)基因,^錨定開(kāi)始,$錨定結(jié)尾
#,LIPE2,:匹配LIPE2在中間,前后都有其他基因
#^LIPE2,:匹配LIPE2在開(kāi)始,后面有基因
#,LIPE2$:匹配LIPE2在結(jié)尾,前面有基因
#|是或,即滿(mǎn)足其中任何一個(gè)條件即可
grepl("^LIPE2$|,LIPE2,|^LIPE2,|,LIPE2$",s)
#[1] FALSE FALSE TRUE TRUE FALSE
方法二,利用\b,單詞邊界
#\b匹配一個(gè)單詞邊界,也就是指單詞和空格間的位置。
#例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。
grepl("\\bLIPE2\\b",s)
#[1] FALSE FALSE TRUE TRUE FALSE
方法三,利用strsplit和%in%
sapply(s,function(x){
'LIPE2' %in% strsplit(x,',')[[1]]
})
返回的結(jié)果是

如果對(duì)strsplit還不熟悉的小伙伴,其實(shí)可以先輸出來(lái)看看結(jié)果
sapply(s,function(x){
strsplit(x,',')[[1]]
})
返回的結(jié)果是分割之后的字符串向量

參考資料: