当前位置: 首页 > 知识库问答 >
问题:

如何在 R 中用交错字符替换另一个字符串

谷梁宁
2023-03-14

我有以下字符串:

x  <- "??????????DRHRTRHLAK??????????"
x2 <- "????????????????????TRCYHIDPHH"
x3 <- "FKDHKHIDVK????????????????????TRCYHIDPHH"
x4 <- "FKDHKHIDVK????????????????????"

我想做的是用另一个字符串替换所有 字符

rep <- "ndqeegillkkkkfpssyvv"

结果是:

ndqeegillkDRHRTRHLAKkkkfpssyvv           # x
ndqeegillkkkkfpssyvvTRCYHIDPHH           # x2
FKDHKHIDVKndqeegillkkkkfpssyvvTRCYHIDPHH # x3
FKDHKHIDVKndqeegillkkkkfpssyvv           # x4

基本上,保持rep的顺序替换为x中的交错字符DRHRTRHLAK

< code>rep的总长度与< code >的总长度相同?,20个字符。

请注意,我不想作为额外的步骤再次手动拆分< code>rep。

我尝试了这个,但失败了:

>gsub(pattern = "\\?+", replacement = rep, x = x)
[1] "ndqeegillkkkkfpssyvvDRHRTRHLAKndqeegillkkkkfpssyvv"

共有3个答案

龙学
2023-03-14

你可以数数 ?s,然后基于此削减代表

x <- "??????????DRHRTRHLAK??????????"
rep <- "ndqeegillkkkkfpssyvv"

pattern <- "(\\?+)(DRHRTRHLAK)(\\?+)"
n <- nchar(gsub(pattern, "\\1", x))

gsub(pattern, paste0(substr(rep, 1, n), "\\2", substr(rep, n+1, nchar(rep))), x)
#[1] "ndqeegillk??????????kkkfpssyvv"

一个非常冗长的方法是执行if-else链,检查在哪里s是,并相应地替换rep

if(grepl("^\\?.+\\?$", x)){ #?'s on both ends
  n <- gsub(pattern, "\\1", x) %>% nchar()
  gsub(pattern, paste0(substr(rep, 1, n), "\\2", substr(rep, n+1, nchar(rep))), x)
} else if(grepl("^\\?", x)){ #?'s only on start
  n <- gsub(pattern, "\\1", x) %>% nchar()
  gsub(pattern, paste0(substr(rep, 1, n), "\\2"), x)
} else if(grepl("\\?$", x)){ #?'s only on end
  n <- gsub(pattern, "\\2", x) %>% nchar()
  gsub(pattern, paste0("\\2", substr(rep, 1, n)), x)
} else if(grepl("^[A-Z]+\\?+[A-Z]+$", x)){ #?'s only on middle
  n <- gsub(pattern, "\\2", x) %>% nchar()
  gsub("([A-Z]+)\\?+([A-Z]+)", paste0("\\1", substr(rep, 1, n), "\\2"), x)
}
濮阳钟展
2023-03-14

使用 substr() 进行字符串拆分:

x <- "??????????DRHRTRHLAK??????????"
rep <- "ndqeegillkkkkfpssyvv"
x<-gsub(pattern = "^\\?+", replacement = substr(rep, 1, 10), x = x)
x<-gsub(pattern = "\\?+$", replacement = substr(rep, 11, 20), x = x)
x
#[1] "ndqeegillkDRHRTRHLAKkkkfpssyvv"

Regex^匹配开始,而$则匹配结束。

夏才
2023-03-14

示例数据:

x <- c(
    "??????????DRHRTRHLAK??????????",
    "????????????????????TRCYHIDPHH",
    "FKDHKHIDVK????????????????????TRCYHIDPHH"
)
rep <- "ndqeegillkkkkfpssyvv"

使用正则表达式修复它

gr <- gregexpr("\\?+", x)
csml <- lapply(gr, \(x) cumsum(attr(x, "match.length")) )
regmatches(x, gr) <- lapply(csml, \(x) substring(rep, c(1,x[-length(x)]+1), x))
#[1] "ndqeegillkDRHRTRHLAKkkkfpssyvv"          
#[2] "ndqeegillkkkkfpssyvvTRCYHIDPHH"          
#[3] "FKDHKHIDVKndqeegillkkkkfpssyvvTRCYHIDPHH"

 类似资料:
  • 问题内容: 我有以下数据框 我想更换和使用,所以最终的数据帧 我尝试了以下操作,但没有成功: 问题答案: 解决方案与通过: 如果需要将列中的所有值设置为一些:

  • 我想在java中将所有“特殊字符”替换为特殊字符 例如“现金” 我有一个示例CSV文件 这里的CSV标题是“What”和“Where” 预期产出 示例代码如下 所有特殊字符、所有空格和双引号都应删除并替换为所需的输出。 我使用的是值。replaceAll(“[^A-Za-z0-9]”,“”),但它不工作。 错误 感谢您的帮助。regex的新成员。

  • 我有以下数据框 我想用替换和,因此最终的数据帧是 我尝试了以下方法,但不起作用:

  • 问题内容: 假设我有以下代码: 这段代码运行后,价值会 如果我以相反的顺序替换它们,则会发生类似的问题: 的值将是 我的目标是把成我怎么能做到呢? 问题答案: 使用Apache Commons StringUtils中的方法:

  • 问题内容: 我有一些带有数字和英文单词的字符串,我需要通过找到它们并将其替换为该单词的本地化版本,将它们翻译成我的母语。您知道如何轻松实现替换字符串中的单词吗? 谢谢 编辑: 我已经尝试过(字符串“ to”的一部分应替换为“ xyz”): 但这不起作用… 问题答案: 它正在工作,但是不会修改调用者对象,而是返回一个新的String。 因此,您只需要将其分配给新的String变量或自身即可: 要么

  • 问题内容: 我想做这个: 我基本上想返回字符串:{(str)-> str} 我一直在获取未定义的变量。 抱歉,这是我的第一篇文章。 问题答案: 由于Python中的字符串是不可变的,因此每次使用该方法时,都必须创建一个新字符串。每次替换调用也必须遍历整个字符串。这显然是低效的,尽管在此规模上并不明显。 一种替代方法是使用列表组合(docs,tutorial)一次遍历字符串并创建一个新字符列表。该方