正则表达式R用括号替换向量

时间:2016-02-24 05:59:39

标签: regex r

假设我有一个字符串x,就像这样。

x <- "CTTTANNNNNNNYG"

我想用不同长度的字符串替换x中的每个字母。

a <- c("A","C","G","T","W","S","M","K","R","Y","B","D","H","V","N")
b <- c("A","C","G","T","(A|T)","(C|G)","(A|C)","(G|T)","(A|G)","(C|T)","(C|G|T)","(A|G|T)","(A|C|T)","(A|C|G)","(A|C|G|T)")

如果我想将向量a中的字母替换为向量b中的对应字母,我会想要将字符串x操作为:

"CTTTA(A|C|G|T)(A|C|G|T)(A|C|G|T)(A|C|G|T)(A|C|G|T)(A|C|G|T)(A|C|G|T)(C|T)G"

我尝试使用mapply(gsub, a,b,x)str_replace()无济于事。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:4)

我们可以使用mgsub

中的library(qdap)
library(qdap)
mgsub(a, b, x)
#[1] "CTTTA(A|C|G|T)(A|C|G|T)(A|C|G|T)(A|C|G|T)(A|C|G|T)(A|C|G|T)(A|C|G|T)(C|T)G"

答案 1 :(得分:4)

由于替换是&#34;固定&#34;并且只涉及一个字母,您可以实现相同的结果,而不使用$('.grindpost a').each(function(e){ $(this).click(function(e){ if ($(this).closest('.grindpost').css('opacity') != 1) { e.preventDefault(); return false; } }); }); 或任何其他包。例如:

regex

答案 2 :(得分:2)

如果您想使用基本函数执行此操作,则需要基本上按顺序执行每个替换(gsub不以这种方式进行矢量化)。这是实现这一目标的一种方法

Reduce(
    function(x, replace) {
        gsub(replace$pattern, replace$value, x)
    }, 
    Map(function(a,b) list(pattern=a, value=b), a, b), 
    init=x
)
# [1] "CTTTA(A|C|G|T)(A|C|G|T)(A|C|G|T)(A|C|G|T)(A|C|G|T)(A|C|G|T)(A|C|G|T)(C|T)G"

我们使用Map制作匹配/替换值对,然后使用Reduce

依次将它们应用于字符串