如何仅替换R中字符串的第二个字符

如何仅替换R中字符串的第二个字符,r,string,substitution,R,String,Substitution,如何替换R中特定位置的字符 仅将字符串s中的第二个H替换为Q尝试以下操作 s = "HsdKjnsjsHLKsmH" sub("[^H]*H[^H]*\\KH","Q",s,perl=T) #[1] "HsdKjnsjsQLKsmH" 如果您想概括上面的代码,这里有一个函数可以这样做 s <- "HsdKjnsjsHLKsmH" sub("(H[^H]*)H", "\\1Q", s) 尝试以下方法 s = "HsdKjnsjsHLKsmH" sub("[^H]*H[^H]*\\KH

如何替换R中特定位置的字符 仅将字符串s中的第二个H替换为Q

尝试以下操作

s = "HsdKjnsjsHLKsmH"
sub("[^H]*H[^H]*\\KH","Q",s,perl=T)


#[1] "HsdKjnsjsQLKsmH"
如果您想概括上面的代码,这里有一个函数可以这样做

s <- "HsdKjnsjsHLKsmH"
sub("(H[^H]*)H", "\\1Q", s)
尝试以下方法

s = "HsdKjnsjsHLKsmH"
sub("[^H]*H[^H]*\\KH","Q",s,perl=T)


#[1] "HsdKjnsjsQLKsmH"
如果您想概括上面的代码,这里有一个函数可以这样做

s <- "HsdKjnsjsHLKsmH"
sub("(H[^H]*)H", "\\1Q", s)
我们可以使用gregexpr和substr。gregexpr查找所有匹配项并返回匹配项的位置。使用第二个匹配的位置,我们可以使用substr将第二个H替换为Q。这保证了我们要替换的始终是第二个H:

replaceSecond <- function(s, old, new){
    pattern <- paste0("(", old, "[^", old, "]*)", old)
    new <- paste0("\\1", new)
    sub(pattern, new, s)
}

replaceSecond(s, "H", "Q")
#[1] "HsdKjnsjsQLKsmH"
我们可以使用gregexpr和substr。gregexpr查找所有匹配项并返回匹配项的位置。使用第二个匹配的位置,我们可以使用substr将第二个H替换为Q。这保证了我们要替换的始终是第二个H:

replaceSecond <- function(s, old, new){
    pattern <- paste0("(", old, "[^", old, "]*)", old)
    new <- paste0("\\1", new)
    sub(pattern, new, s)
}

replaceSecond(s, "H", "Q")
#[1] "HsdKjnsjsQLKsmH"

gsub^..,替换=\\1Q,HsdKjnsjsHLKsmH,perl=T@R.S.这不会返回所需的输出。@avid\u userR。是的,我的错。我误读了这个问题。这个问题应该解决了:gsubh[^h]*h,replacement=\\1\\2Q,hsdkjnsjslksmh,perl=T,ignore.case=T你能解释一下代码吗?gsub^..,replacement=\\1Q,HsdKjnsjsHLKsmH,perl=T@R.S.这不会返回所需的输出。@avid\u userR。是的,我的错。我误读了这个问题。应该这样做:gsubh[^h]*h,replacement=\\1\\2Q,HsdKjnsjsHLKsmH,perl=T,ignore.case=T您能解释一下代码吗?我认为这是一个很好的解决方案,因为它提供了在第n位匹配x的通用方法。1up!您将如何使用第一种方法用QQQ替换第二个H?@AndreElrico问得好。我还没有弄明白。同时,stringr方法也有效。我认为这是一个很好的解决方案,因为它提供了一种在第n个位置匹配x的通用方法。1up!您将如何使用第一种方法用QQQ替换第二个H?@AndreElrico问得好。我还没有弄明白。同时,stringr方法也起作用。这只是从选择中删除我在\\K之前匹配的所有内容。具体来说,这意味着[^H]*H[^H]*。我可以在后面看一看,但对于像[^H]*这样的非特定长度,这不起作用。谢谢。我不知道我们能做到这一点。至于lookbehind和[^H]*,那一定是因为R中的lookbehind只有在事先知道长度时才起作用。这是可行的,尽管它没有太多实际用途-sub?这只是从选择中删除我在\\K之前匹配的所有内容。具体来说,这意味着[^H]*H[^H]*。我可以在后面看一看,但对于像[^H]*这样的非特定长度,这不起作用。谢谢。我不知道我们能做到这一点。至于lookbehind和[^H]*,那一定是因为R中的lookbehind只有在事先知道长度时才起作用。这是可行的,即使它没有太多的实际用途-子?