You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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"

函数说明

  1. 拆分字符串:通过正则表达式将目标字符串拆分为由连续?或非?组成的片段;
  2. 逐段处理:遍历每个片段,遇到?段时,从rep的当前位置截取对应长度的字符进行替换,同时更新rep的指针位置;遇到非?段则直接保留;
  3. 拼接结果:将处理后的所有片段拼接成最终字符串。

内容的提问来源于stack exchange,提问作者littleworth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 06:35:48