R:删除字符串

时间:2017-12-15 19:04:31

标签: r substring substitution

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

我现在就是这样做的:

# 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)

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

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

3 个答案:

答案 0 :(得分:2)

1)strsplit / paste 将输入分解为字符,省略16到20之间的输入,将其折叠回来并用单个空格替换空格。仅使用基本功能。

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

2)substr&lt; - 用空格替换指示的字符,然后将空格的运行减少到一个空格。仅使用基本功能。

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

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

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

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

答案 1 :(得分:0)

您也可以像这样使用paste0substr: -

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

答案 2 :(得分:0)

我相信,如果将方法编码为通用函数,我的解决方案几乎就是您所能得到的,但是到这里为止。我首先使用一个名为“ 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)+length(rm_end), 
               nchar(string))

  new <- gsub("\\s{2,}"," ",paste(sub1, sub2))

  return(new)
}

mystring <- "Hello, how are {you} doing?"
rm_substr(mystring, "{", "}")
相关问题