我对正则表达式并不熟悉,并希望在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"
我很感激我能得到的任何帮助!谢谢!
答案 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