2013-11-26 115 views
6

我不熟悉所有正則表達式,並願做模式匹配和更換R.模式匹配和替換R中

我想更換圖案#1#2在矢量:original = c("#1", "#2", "#10", "#11")與向量的每個值vec = c(1,2)

我正在尋找的結果是以下載體:c("1", "2", "#10", "#11") 我不知道該怎麼做。我試圖做:

for(i in 1:2) { 
    pattern = paste("#", i, sep = "") 
    original = gsub(pattern, vec[i], original, fixed = TRUE) 
} 

,但我得到:替代

#> original 
#[1] "1" "2" "10" "11" 

"1" "2" "#10" "#11"

我希望得到任何幫助我能!謝謝!

回答

3

另一種選擇使用gsubfn

library(gsubfn) 
gsubfn("^#([1-2])$", I, original) ## Function substituting 
[1] "1" "2" "#10" "#11" 

或者,如果你想明確地使用矢量的值,用VEC值:

gsubfn("^#[1-2]$", as.list(setNames(vec,c("#1", "#2"))), original) 

或者公式符號等同於函數符號:

gsubfn("^#([1-2])$", ~ x, original) ## formula substituting 
+0

謝謝!但由於某種原因,當我嘗試使用表達式'「^#1 $」'替換模式'#1'時,它不起作用!我很困惑.. – Mayou

+0

這是我爲**'#1'嘗試**:'gsub(paste(「^#」,i,「$」,sep =「」),1,original)''和'gsubfn(paste(「^#」,i,「$」,sep =「」),1,original)',但沒有任何工作:S – Mayou

+0

'gsubfn(「^#([1-2])$」 ,我,原創)'**我**這裏是「大寫字母我」身份不是1。 – agstudy

7

指定您匹配從開始(^)到結束($)的整個字符串。

這裏,我匹配的正是你正在尋找在這個例子中的條件,但我猜你需要擴展它:

> gsub("^#([1-2])$", "\\1", original) 
[1] "1" "2" "#10" "#11" 

所以,這基本上,「從一開始就,尋找一個哈希符號,後面跟着一個或兩個確切的數字,其中一個或兩個應該只是一個數字(這就是爲什麼我們不使用*+或者其他什麼)並且結束字符串。一個或兩個,因爲我們想「反向引用」它。「

+1

謝謝!你能向我解釋一下''\'1''是什麼意思?這與vec = c(1,2)'中的替換值有什麼關係?非常感謝 – Mayou

+0

比你。這個想法是我的例子,非常簡單。但是,在我的實際情況中,我需要明確地使用'vec'向量的值進行替換,而不僅僅是放下'#'符號。你能否推廣這個公式? – Mayou

+0

@AnandaMahto所以「capture」是'()'而「backreference」是'「\\ 1」'? – zx8754

3

這裏有一個稍微不同的採取,使用零寬度負向預測聲明(多嘴!)。這是(?!...),它在字符串的開頭匹配#,只要它沒有跟在...之後。在這種情況下,兩個(或等同地,更多,只要它們是連續的)數字。它沒有任何東西取代它們。

gsub("^#(?![0-9]{2})" , "" , original , perl = TRUE) 
[1] "1" "2" "#10" "#11"