是否有一种优雅的方法可以根据字符索引删除字符串中的子字符串?
我现在就是这样做的:
# 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)
我当然可以将其写成一般功能,但我只是想知道是否有一个优雅的解决方案,例如替换字符串中的索引,没有任何内容或其他单词。
注意:这不是正则表达式问题。
答案 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)
您也可以像这样使用paste0
和substr
: -
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, "{", "}")