如何在R语言中用指定字符串交错替换问号字符
按顺序替换字符串中的问号并保留交错字符
需求说明
现有以下R字符串:
x <- "??????????DRHRTRHLAK??????????" x2 <- "????????????????????TRCYHIDPHH" x3 <- "FKDHKHIDVK????????????????????TRCYHIDPHH" x4 <- "FKDHKHIDVK????????????????????"
需要将所有?字符按顺序替换为字符串:
rep <- "ndqeegillkkkkfpssyvv"
要求保持rep的字符顺序,替换时保留原字符串中的非?内容,最终得到如下结果:
ndqeegillkDRHRTRHLAKkkkfpssyvv # x ndqeegillkkkkfpssyvvTRCYHIDPHH # x2 FKDHKHIDVKndqeegillkkkkfpssyvvTRCYHIDPHH # x3 FKDHKHIDVKndqeegillkkkkfpssyvv # x4
注:rep总长度与所有?的总长度一致,均为20个字符,且无需手动分割rep。
失败尝试
直接使用gsub会将每一段?都替换为完整的rep,导致结果不符合需求:
> gsub(pattern = "\\?+", replacement = rep, x = x) [1] "ndqeegillkkkkfpssyvvDRHRTRHLAKndqeegillkkkkfpssyvv"
解决方案
可以编写一个自定义函数,按顺序分配rep的字符来替换每一段?:
replace_question_marks <- function(target_str, rep_str) { # 将目标字符串拆分为问号段和非问号段 segments <- strsplit(target_str, "(\\?+|[^?]+)")[[1]] segments <- segments[segments != ""] # 过滤空片段 rep_pos <- 1 result_segs <- character(length(segments)) for (i in seq_along(segments)) { current_seg <- segments[i] if (grepl("^\\?", current_seg)) { seg_length <- nchar(current_seg) # 从rep_str中截取对应长度的字符段 replacement <- substr(rep_str, rep_pos, rep_pos + seg_length - 1) result_segs[i] <- replacement rep_pos <- rep_pos + seg_length } else { result_segs[i] <- current_seg } } # 拼接所有片段得到最终结果 paste(result_segs, collapse = "") } # 测试函数 x <- "??????????DRHRTRHLAK??????????" x2 <- "????????????????????TRCYHIDPHH" x3 <- "FKDHKHIDVK????????????????????TRCYHIDPHH" x4 <- "FKDHKHIDVK????????????????????" rep <- "ndqeegillkkkkfpssyvv" # 输出结果 replace_question_marks(x, rep) # [1] "ndqeegillkDRHRTRHLAKkkkfpssyvv" replace_question_marks(x2, rep) # [1] "ndqeegillkkkkfpssyvvTRCYHIDPHH" replace_question_marks(x3, rep) # [1] "FKDHKHIDVKndqeegillkkkkfpssyvvTRCYHIDPHH" replace_question_marks(x4, rep) # [1] "FKDHKHIDVKndqeegillkkkkfpssyvv"
函数说明
- 拆分字符串:通过正则表达式将目标字符串拆分为由连续
?或非?组成的片段; - 逐段处理:遍历每个片段,遇到
?段时,从rep的当前位置截取对应长度的字符进行替换,同时更新rep的指针位置;遇到非?段则直接保留; - 拼接结果:将处理后的所有片段拼接成最终字符串。
内容的提问来源于stack exchange,提问作者littleworth
相关产品推荐
相关产品推荐

