【问题标题】:Replace parts of string using package stringi (regex)使用包 stringi(正则表达式)替换部分字符串
【发布时间】:2014-11-29 17:12:57
【问题描述】:

我有一些字符串

string <- "abbccc"

我想将同一字母的链替换为仅一个字母和该字母的出现次数。所以我想要这样的东西: "ab2c3"

我使用stringi 包来执行此操作,但它并不完全像我想要的那样工作。假设我已经有了带有替换零件的向量:

vector <- c("b2", "c3")
stri_replace_all_regex(string, "([a-z])\\1{1,8}", vector)

输出:

[1] "ab2b2" "ac3c3"

我想要的输出:[1] "ab2c3"

我也试过这种方式

stri_replace_all_regex(string, "([a-z])\\1{1,8}", vector, vectorize_all=FALSE)

但我得到错误

Error in stri_replace_all_regex(string, "([a-z])\\1{1,8}", vector, vectorize_all = FALSE) : 
  vector length not consistent with other arguments

【问题讨论】:

  • string &lt;- 'bbaccc' 的预期输出是什么'b2ac3'
  • 它是"b2ac3"。其他示例"good" --&gt; "go2d""uffff" --&gt; "uf4"。我知道如何用“新”部分而不是旧部分创建矢量,但我不知道如何正确替换它。
  • 对不起,你没事。引号的类型当然无关紧要。

标签: regex r string stringi


【解决方案1】:

不是正则表达式,而是 strsplitrle 以及一些 paste 魔法:

string <- c("abbccc", "bbaccc", "uffff", "aaabccccddd")

sapply(lapply(strsplit(string, ""), rle), function(x) {
    paste(x[[2]], ifelse(x[[1]] == 1, "", x[[1]]), sep="", collapse="")
})

## [1] "ab2c3"   "b2ac3"   "uf4"     "a3bc4d3"

【讨论】:

    【解决方案2】:

    不是stringi 解决方案,也不是regex,但您可以通过拆分字符串并使用rle 来做到这一点:

        string <- "abbccc"
        res<-paste(collapse="",do.call(paste0,rle(strsplit(string,"",fixed=TRUE)[[1]])[2:1]))
        gsub("1","",res)
        #[1] "ab2c3"
    

    【讨论】:

      猜你喜欢
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-25
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      相关资源
      最近更新 更多