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

如何用向量中的字符替换字符串中的字符,并使用R保持其顺序

顾永福
2023-03-14

我有一根绳子:

 seed_pattern <- "K?ED??HRDDKDKD?HE?REKE??DE?KKK"

给定另一个字符串

bb_seq <- "rhhhhitv"

我想做的是替换<code> bb_seq的顺序,在bbs_seq添加一个字符,得到:

<代码>的总长度?保证与< code>bb_seq相同。

KrEDhhHRDDKDKDhHEhREKEitDEvKKK

我如何用R实现这一点?

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

  seed_pattern <- "K?ED??HRDDKDKD?HE?REKE??DE?KKK"
  bb_seq <- "rhhhhitv"
  sp <- seed_pattern
  gr   <- gregexpr("\\?+", sp)
  csml <- lapply(gr, function(sp) cumsum(attr(sp, "match.length")))
  regmatches(sp, gr) <- lapply(csml, function(sp) substring(bb_seq, c(1, sp[1]), sp))
  sp

  # KrEDrhhHRDDKDKDrhhhHErhhhhREKErhhhhitDErhhhhitvKKK

我对非正则表达式解决方案持开放态度。

共有3个答案

柳胜
2023-03-14

您可以通过替换一个< code >来做到这一点(可能不是很有效)?一次:

seed_pattern <- "K?ED??HRDDKDKD?HE?REKE??DE?KKK"
bb_seq <- "rhhhhitv"

for (ch in unlist(strsplit(bb_seq, ""))) {
  print(ch)
  seed_pattern <- sub("?", ch, seed_pattern, fixed = TRUE)
}

print(seed_pattern)
# [1] "KrEDhhHRDDKDKDhHEhREKEitDEvKKK"

遗憾的是,< code>sub并没有通过< code>replacement参数进行矢量化处理!

诸葛煜
2023-03-14

你可以用一行程序来完成,只需对你之前问题的答案稍加修改(谢谢@thelatemail):

regmatches(seed_pattern, gregexpr("\\?", seed_pattern)) <- strsplit(bb_seq, "")

检查是否提供预期结果:

seed_pattern == "KrEDhhHRDDKDKDhHEhREKEitDEvKKK"
[1] TRUE
寿意远
2023-03-14

拆分、替换、组合:

> target <- strsplit(seed_pattern, "")[[1]]
> replacement <- strsplit(bb_seq, "")[[1]]
> target[target=="?"] <- replacement
> paste(target, collapse = "")
[1] "KrEDhhHRDDKDKDhHEhREKEitDEvKKK"
 类似资料:
  • 问题内容: 我有一个字符串,该字符串是通过阅读HTML网页获得的,其中包含带有项目符号的项目符号,该项目符号带有“•”之类的符号。请注意,该文本是使用Python 2.7的网页的HTML来源。 我知道项目符号字符的unicode字符为,但是实际上如何用其他东西替换该unicode字符呢? 我试着做 但它似乎不起作用…我该怎么做? 问题答案: 将字符串解码为Unicode。假设它是UTF-8编码的:

  • 我有一个文本包含一些我想要标记的单词,要标记的单词包含在一个列表中。问题是其中一些单词是其他单词的子字符串,但我想从列表中标记最长的可识别字符串。 例如,如果我的文本是“foo和bar不同于foo bar。”我的列表包含“foo”、“bar”和“foo bar”,结果应该是“[tag]foo[/tag]和[tag]bar[/tag]不同于[tag]foo bar[/tag]。”

  • 我希望我的程序替换输入字符串中的每个元音。

  • 我有以下字符串: 我想做的是用另一个字符串替换所有 字符 结果是: 基本上,保持的顺序替换为中的交错字符。 < code>rep的总长度与< code >的总长度相同?,20个字符。 请注意,我不想作为额外的步骤再次手动拆分< code>rep。 我尝试了这个,但失败了:

  • 输入 system.out.println(leetspeech(“柏林”,替换(“b=8,l=1”)));//=>8er1in 柏林的B和l换成了一个8和1。 我的方法看起来是这样的 但不行,有人能帮我吗?