R中的模式匹配和替换

May*_*you 6 regex r gsub

我对正则表达式一点都不熟悉,想在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)
}
Run Code Online (Sandbox Code Playgroud)

但我得到:

#> original
#[1] "1"  "2"  "10" "11"
Run Code Online (Sandbox Code Playgroud)

代替: "1" "2" "#10" "#11"

我将不胜感激任何帮助!谢谢!

A5C*_*2T1 7

指定您匹配从start(^)到end($)的整个字符串.

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

> gsub("^#([1-2])$", "\\1", original)
[1] "1"   "2"   "#10" "#11"
Run Code Online (Sandbox Code Playgroud)

所以,这是基本,"从一开始,寻找一个散列符号后接的确切数量一个或两个.在一个或两个应该只是一个数字(这就是为什么我们不使用*+什么的),也结束哦,并抓住那一两个,因为我们想"反对"它."


ags*_*udy 3

另一种选择使用gsubfn

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

或者,如果您想显式使用向量的值,请使用 vec 值:

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

或者等价于函数表示法的公式表示法:

gsubfn("^#([1-2])$",  ~ x, original)   ## formula substituting
Run Code Online (Sandbox Code Playgroud)