2010-12-18 48 views
4

如何grep與fixed=T,但只在字符串的開始?在固定= T在R的字符串的開始grep?

grep("a.", c("a.b", "cac", "sss", "ca.f"), fixed = T) 
# 1 4 

我想只得到第一次出現。 [編輯:匹配的字符串是事先不知道的,可以是任何東西。 「一個。」僅僅是爲了舉例]

謝謝。

[編輯:我有點解決它,但任何其他想法是非常受歡迎的。我會接受任何替代解決方案的答案。

s <- "a." 
res <- grep(s, c("a.b", "cac", "sss", "ca.f"), fixed = T, value = T) 
res[substring(res, 1, nchar(s)) == s] 

]

回答

9

如果你想匹配的字符串(字符串2)年初的確切字符串(字符串1),那麼就你的子集串2是相同長度的字符串1和使用== ,應該相當快。

+0

只是驚人的有時眼睛看不到明顯的! 'res [substring(res,1,nchar(s))== s]'在我的解決方案中完全是這個東西!感謝Greg,讓我醒來。 – VitoshKa 2010-12-18 19:08:54

+0

一個整潔的解決方案 – 2010-12-18 19:52:58

1

你想使用fixed=T因爲在模式.的?在這種情況下,你可以逃脫.這會工作:

grep("^a\\.", c("a.b", "cac", "sss", "ca.f")) 
+0

該名稱可以是任何事情,我不知道它提前,它可以包含「。」。或任何其他正則表達式字符,如\,|,[等。這就是爲什麼我需要固定= T – VitoshKa 2010-12-18 13:50:45

1

如果你只想專注於前兩個字符,那麼只存在這麼多的信息到grep:

> grep("a.", substr(c("a.b", "cac", "sss", "ca.f"), 1,2) ,fixed=TRUE) 
[1] 1 

你可以它很容易地包裝成一個功能:

> checktwo <- function (patt,vec) { grep(patt, substr(vec, 1,nchar(patt)) ,fixed=TRUE) } 
> checktwo("a.", c("a.b", "cac", "sss", "ca.f")) 
[1] 1 
+0

「a」。僅僅是爲了舉例。例如,它可以是sds.s。[\ sf^sdf。我編輯了我的帖子來澄清這一點。 – VitoshKa 2010-12-18 14:18:43

+1

然後,您只需將nchar(patt)替換爲substr的第三個參數即可。 – 2010-12-18 14:22:32

+0

另一個整潔的解決方案 – 2010-12-18 19:53:05

1

我覺得摹博士有鑰匙在他回答的解決方案,但並沒有明確地調用它:「^」,在模式指定「之初字符串「。 (「$」表示在字符串的末尾)

所以他的「^ a」。模式意味着「在字符串的開頭,尋找一個'a',後面跟着任何一個字符[''']」。

或者你可以使用「^ a」作爲模式,除非你不想匹配只包含「a」的一個字符串。

這有幫助嗎?

傑弗裏

+0

我不能使用^因爲固定= T – VitoshKa 2010-12-18 19:02:41

3

實際上,格雷格和你已經提到了最乾淨的解決方案。我甚至會下降完全grep的:

> name <- "a#" 
> string <- c("a#b", "cac", "sss", "ca#f") 
> string[substring(string, 1, nchar(name)) == name] 
[1] "a#b" 

但如果你真的堅持grep的,您可以使用Dwins方法,或以下mindboggling解決方案:

specialgrep <- function(x,y,...){ 
    grep(
    paste("^", 
      gsub("([].^+?|[#\\-])","\\\\\\1",x) 
      ,sep=""), 
    y,...) 
} 
> specialgrep(name,string,value=T) 
[1] "a#b" 

這可能是我忘了,包括一些字符在gsub中。確保你先保留這個符號,然後把它放在字符集中,否則你會得到錯誤。或者忘記它,使用你自己的解決方案。這一個只是爲了樂趣:-)

+0

+ 1爲「只爲樂趣」的解決方案,實際上它可以輕鬆擴展以解決更多涉及的問題,當只使用一些「正則表達式」符號並且任何其他的必須反斜槓時。 – VitoshKa 2010-12-19 22:05:03