R 用一个正则表达式替换字符串中的模式
我想替换字符串中的后缀。此后缀可以是R 用一个正则表达式替换字符串中的模式,r,regex,R,Regex,我想替换字符串中的后缀。此后缀可以是.x或.y。如果它是.x我想用string1替换它(比如说)如果它是.y它应该被string2替换。(替换字符串是任意的,但后缀和替换字符串之间有明确的映射,例如.x->.string1和.y->.string2) 我可以通过如下方式使用两次调用gsub轻松实现这一点: in_str <- c("a.x", "a.y") gsub("\\.y$", ".string2", gsub("\\.x$", ".string1", in_str))) # [1]
.x
或.y
。如果它是.x
我想用string1
替换它(比如说)如果它是.y
它应该被string2
替换。(替换字符串是任意的,但后缀和替换字符串之间有明确的映射,例如.x->.string1
和.y->.string2
)
我可以通过如下方式使用两次调用gsub
轻松实现这一点:
in_str <- c("a.x", "a.y")
gsub("\\.y$", ".string2", gsub("\\.x$", ".string1", in_str)))
# [1] "a.string1" "a.string2"
in_str我不认为这就是正则表达式的用途,我会用不同的方式:
in_str <- c("a.x", "a.y", "b.y", "b.x")
strmap <- c(.x="string1", .y="string2")
strmap[ gsub(".*(\\.[xy])$", "\\1", in_str) ]
这样做的好处是更加灵活,并且可以将后缀映射的定义与进行映射的实际函数清晰地分开。您甚至可以将其自动化:
in_str <- c("a.x", "a.y", "b.y", "b.x")
strmap <- c(x="string1", y="string2")
suffixes <- paste0(names(strmap), collapse="")
pattern <- sprintf(".*\\.([%s])$", suffixes)
res <- strmap[ gsub(pattern, "\\1", in_str) ]
names(res) <- in_str
您可以使用mgsub
,它接受具有多个替换的多个模式
mgsub::mgsub(in_str, c("\\.x$", "\\.y$"), c(".string1", ".string2"))
#[1] "a.string1" "a.string2"
从“干净代码”的角度来看,首先将字符串拆分为前缀和后缀,然后使用if
构建新字符串肯定会更清楚。可能有兴趣。@ismirsehregal谢谢,这正是我想要的+1!作为参考,代码如下:gsubfn(“\\..$”,list(“.x”=”.string1“,“.y”=”.string2”),in_str)
@thothal如果链接提供了您问题的答案,您认为它应该标记为该问题的副本吗?或者你认为这些是不同的问题?是的,的确如此,我把它标记为重复的,谢谢你指出。谢谢你的回答。这并不完全是我想要的,因为我只想替换后缀,而不是整个字符串,所以结果应该是c(“a.string1”、“a.string2”、“b.string1”、“b.string2”)
。我知道如何调整您的代码来实现这一点,但我想在这种情况下,2gsub
更容易。
a.x a.y b.y b.x
"string1" "string2" "string2" "string1"
mgsub::mgsub(in_str, c("\\.x$", "\\.y$"), c(".string1", ".string2"))
#[1] "a.string1" "a.string2"