根据R中的模糊分隔符拆分字符串

时间:2017-08-25 08:24:18

标签: r strsplit

我有一对包含在数据框中的字符串:

df <- data.frame(str = c("L_V1_ROI-L_MST_ROI",
                         "L_V6_ROI-L_V2_ROI",
                         "L_V3_ROI-L_V4_ROI",
                         "L_V8_ROI-L_4_ROI",
                         "L_p9-46v_ROI-L_a9-46v_ROI"))

每对由-符号分隔,但最后一对包含三个-符号除外,应分为子串L_p9-46v_ROIL_a9-46v_ROI

任务是根据分隔符将这些对分成子串。要做到这一点,我只需使用:

library(tidyr)
df %>% separate(data = df, col = str, into = c("str1", "str2"), sep = "-")

得出以下结果:

      str1      str2
1 L_V1_ROI L_MST_ROI
2 L_V6_ROI  L_V2_ROI
3 L_V3_ROI  L_V4_ROI
4 L_V8_ROI   L_4_ROI
5     L_p9   46v_ROI
Warning message:
Too many values at 1 locations: 5 

正如所料,问题在于第5对有多个-符号。

问题:匹配正确的分隔符的正则表达式是什么?

我的部分解决方案粘贴在下面,但我希望应该有更智能的解决方案。

my_split <- function(string, pattern) {
  ## Match start end end position of the "_ROI-"
  position <- str_locate(string = string, pattern = pattern)
  start <- position[1]
  end <- position[2]
  ## Extract substrings
  substring1 <- substr(my_str, 1, start + 3)
  substring2 <- substr(my_str, end + 1, nchar(string))
  return(list(substring1, substring2))
}

## Toy example
my_str <- "L_p9-46v_ROI-L_a9-46v_ROI"
my_split(string = my_str, pattern = "_ROI-")
[[1]]
[1] "L_p9-46v_ROI"

[[2]]
[1] "L_a9-46v_ROI"

0 个答案:

没有答案