R语言中的模式匹配与替换

ohtdti5x  于 10个月前  发布在  R语言
关注(0)|答案(3)|浏览(125)

我对正则表达式一点也不熟悉,想用R做模式匹配和替换
我想替换vector中的模式#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"

li9yvcax

li9yvcax1#

指定要匹配从start(^)到end($)的整个字符串。
在这里,我已经完全匹配了您在这个示例中看到的条件,但我猜您需要扩展它:

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

字符串
所以,这基本上是,“从一开始,寻找一个哈希符号,后面跟着确切的数字1或2。1或2应该只是一个数字(这就是为什么我们不使用*+或其他),也结束字符串。哦,捕获一两个,因为我们想'反向参考'它。

e0uiprwp

e0uiprwp2#

使用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

nfzehxib

nfzehxib3#

这里有一个稍微不同的例子,它使用了 * 零宽度负前瞻Assert *(真拗口!)。这是(?!...),它匹配字符串开头的#,只要它后面没有...中的任何内容。在这种情况下,两个(或等同地,只要它们是连续的)数字。它用什么都没有取代它们。

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

字符串

相关问题