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

时间:2015-08-11 00:53:22

标签: regex r

我有" elephant_giraffe_lion"和" monkey_tiger"字符串。 这里的条件是如果有两个或更多分隔符,我想在第二个分隔符处拆分,如果只有一个分隔符,我想在该分隔符处拆分。因此,我希望在此示例中得到的结果是" elephant_giraffe"和" monkey"。

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

结果

"elephant_giraffe"  "monkey"

2 个答案:

答案 0 :(得分:2)

您可以使用$

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

修改

上述内容仅匹配最后一个&#34; _&#34;,不考虑超过两个&#34; _&#34;的情况。对于更一般的情况,您可以尝试

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"         

答案 1 :(得分:1)

当我在您的其他相关question上发布答案时,基本R解决方案:

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