【问题标题】:R: Remove substring within stringR:删除字符串中的子字符串
【发布时间】:2018-05-30 00:35:13
【问题描述】:

有没有一种优雅的方法可以根据字符的索引删除字符串中的子字符串?

这是我现在的做法:

# My data
mystring <- "Hello, how are {you} doing?"
index_of_substring <- c(16,20)

# Pasting two substrings
mystring_no_substring <- paste0(substr(mystring, 1, index_of_substring[1]-1), substr(mystring, index_of_substring[2]+1, nchar(mystring)))

# Cleaning extra spaces
mystring_no_substring <- gsub("  ", " ", mystring_no_substring)

我当然可以把它写成一个通用函数,但我只是想知道是否有一个优雅的解决方案,例如用任何内容或其他单词替换字符串中的索引。

注意:这不是一个正则表达式问题。

【问题讨论】:

  • stringi::stri_sub(mystring, 16, 20) &lt;- "" 例如?
  • 是的,那已经优雅多了!谢谢。
  • 另一个选项是:stringr::str_sub(mystring, 16, 20) &lt;- ""

标签: r substring substitution


【解决方案1】:

1) strsplit/paste 将输入分解为字符,省略 16 到 20 之间的字符,将其重新折叠在一起并用单个空格替换连续的空格。仅使用基函数。

gsub(" +", " ", paste(strsplit(s, "")[[1]][-seq(ix[1], ix[2])], collapse = ""))
## [1] "Hello, how are doing?"

2) substr 用空格替换指定的字符,然后将空格的运行减少为一个空格。仅使用基本函数。

gsub(" +", " ", "substr<-"(s, ix[1],  ix[2], gsub(".", " ", s)))
## [1] "Hello, how are doing?"

请注意,这是非破坏性的,即它在不修改输入的情况下输出结果。

注意:我们使用了测试输入:

s <- "Hello, how are {you} doing?"
ix <- c(16, 20)

【讨论】:

    【解决方案2】:

    您也可以像这样使用paste0 和substr:-

    paste0(substr(mystring, 1, 14), substr(mystring, 21, 27))
    

    【讨论】:

      【解决方案3】:

      我相信如果将您的方法编码为通用函数,我的解决方案几乎就是您得到的解决方案,但您就可以了。我首先使用一个名为“strpos_fixed”的自定义函数来索引我想要删除的子字符串。我不像我想使用正则表达式那样舒服,所以为了简单起见,我将此函数限制为固定匹配。

      strpos_fixed=function(x,y){
        a<-regexpr(y, x,fixed=T)
        b<-a[1]
        return(b)
      }
      
      
      rm_substr<-function(string,rm_start,rm_end){
      
        sub1<-substr(string,1,strpos_fixed(string, rm_start)-1)
      
        sub2<-substr(string, strpos_fixed(string,rm_end)+nchar(rm_end), 
                     nchar(string))
      
        new <- gsub("\\s{2,}"," ",paste(sub1, sub2))
      
        return(new)
      }
      
      mystring <- "Hello, how are {you} doing?"
      rm_substr(mystring, "{", "}")
      

      【讨论】:

        猜你喜欢
        • 2015-11-20
        • 1970-01-01
        • 2019-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多