我有" 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"