R:删除字符串中的子字符串

问题描述 投票:2回答:3

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

我现在就是这样做的:

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

我当然可以把它写成一般功能,但我只是想知道是否有一个优雅的解决方案,例如用一个或多个单词替换字符串中的索引。

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

r substring substitution
3个回答
2
投票

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)

1
投票

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

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

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)+nchar(rm_end), 
               nchar(string))

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

  return(new)
}

mystring <- "Hello, how are {you} doing?"
rm_substr(mystring, "{", "}")
© www.soinside.com 2019 - 2024. All rights reserved.