在R中分割字符串,如果存在多个分隔符,则跳过第一个分隔符



我有" elephant_giraffe_lion "one_answers" monkey_tiger "字符串。这里的条件是,如果有两个或两个以上的分隔符,我想在第二个分隔符处进行分割,如果只有一个分隔符,我想在那个分隔符处进行分割。所以我想在这个例子中得到的结果是"elephant_giraffe"one_answers"monkey"。

mystring<-c("elephant_giraffe_lion", "monkey_tiger")
结果

"elephant_giraffe"  "monkey"

您可以使用$

将分割锚定到字符串的末尾
unlist(strsplit(mystring, "_[a-z]+$"))
# [1] "elephant_giraffe" "monkey"          

编辑

上面只匹配最后一个"_",不考虑有两个以上"_"的情况。对于更一般的情况,您可以尝试

mystring<-c("elephant_giraffe_lion", "monkey_tiger", "dogs", "foo_bar_baz_bap")
tmp <- gsub("([^_]+_[^_]+).*", "\1", mystring)
tmp[tmp==mystring] <- sapply(strsplit(tmp[tmp==mystring], "_"), `[[`, 1)
tmp
# [1] "elephant_giraffe" "monkey"           "dogs"             "foo_bar"         

您也可以使用gsubfn,处理与函数

的匹配。
library(gsubfn)
f <- function(x,y) if (y==x) strsplit(y, "_")[[1]][[1]] else y
gsubfn("([^_]+_[^_]+).*", f, mystring, backref=1)
# [1] "elephant_giraffe" "monkey"           "dogs"             "foo_bar"         

正如我在你的其他相关问题上发表的答案一样,一个基本的R解决方案:

x <- c('elephant_giraffe_lion', 'monkey_tiger', 'foo_bar_baz_bap')
sub('^(?|([^_]*_[^_]*)_.*|([^_]*)_[^_]*)$', '\1', x, perl=TRUE)
# [1] "elephant_giraffe" "monkey"           "foo_bar" 

最新更新