2013-11-26 55 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"