R中的模式匹配和替换

时间:2013-11-26 14:07:34

标签: regex r gsub

我对正则表达式并不熟悉,并希望在R中进行模式匹配和替换。

我想将向量#1中的模式#2original = 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 个答案:

答案 0 :(得分:7)

指定您匹配从开头(^)到结束($)的整个字符串。

在这里,我完全符合你在这个例子中看到的条件,但我猜你需要扩展它:

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

所以,基本上,“从一开始,寻找一个哈希符号后跟一个或两个确切的数字。一个或两个应该只是一个数字(这就是为什么我们不使用*或者+或者其他东西)并且也结束了字符串。哦,捕获那一两个,因为我们想要'反引用'它。“

答案 1 :(得分:3)

这是一个略有不同的使用零宽度负前瞻断言(多么令人满意!)。这是(?!...),它匹配字符串开头的#,只要它不跟...中的任何内容。在这种情况下,两个(或等效地,只要它们是连续的)数字。它取而代之的是什么。

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

答案 2 :(得分: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