Выражение регулярного выражения strsplit в R, поэтому оно применяется только один раз к первому вхождению указанного символа c в каждой строке? - PullRequest
1 голос
/ 20 января 2020

У меня есть список, заполненный строками: string<- c("SPG_L_subgenual_ACC_R", "SPG_R_MTG_L_pole", "MTG_L_pole_CerebellumGM_L")

Мне нужно разбить строки, чтобы они выглядели так:

"SPG_L", "subgenual_ACC_R", "SPG_R", "MTG_L_pole", "MTG_L_pole", "CerebellumGM_L"

Я пытался использовать следующее выражение регулярного выражения для разделения строк:

str_split(string,'(?<=[[RL]|pole])_')

Но это приводит к:

"SPG_L", "subgenual" "ACC_R", "SPG_R", "MTG_L", "pole", "MTG_L", "pole", "CerebellumGM_L"

Как редактировать выражение регулярного выражения поэтому он разбивает каждый строковый элемент в «_» после первого вхождения «R», «L», если только после первого вхождения «R» или «L» не следует «полюс», а затем разбивает строковый элемент после первое вхождение «полюса» и разбивает каждый элемент строки только один раз?

Ответы [ 3 ]

2 голосов
/ 20 января 2020

Я предлагаю соответствующий подход с использованием

^(.*?[RL](?:_pole)?)_(.*)

См. regex demo

Подробности

  • ^ - начало строки
  • (.*?[RL](?:_pole)?) - Группа 1:
    • .*? - любой ноль или более символов, кроме символов перевода строки, как можно меньше
    • [RL](?:_pole)? - R или L опционально сопровождаются _pole
  • _ - подчеркиванием
  • (.*) - Группа 2: любой ноль или более символов, кроме символов разрыва строки, максимально возможное число

См. демоверсию R :

library(stringr)
x <- c("SPG_L_subgenual_ACC_R", "SPG_R_MTG_L_pole", "MTG_L_pole_CerebellumGM_L", "SFG_pole_R_IFG_triangularis_L", "SFG_pole_R_IFG_opercularis_L" )

res <- str_match_all(x, "^(.*?[RL](?:_pole)?)_(.*)")
lapply(res, function(x) x[-1])

Вывод:

[[1]]
[1] "SPG_L"           "subgenual_ACC_R"

[[2]]
[1] "SPG_R"      "MTG_L_pole"

[[3]]
[1] "MTG_L_pole"     "CerebellumGM_L"

[[4]]
[1] "SFG_pole_R"         "IFG_triangularis_L"

[[5]]
[1] "SFG_pole_R"        "IFG_opercularis_L"
0 голосов
/ 20 января 2020

вы можете использовать sub, затем strsplit, как показано:

strsplit(sub("^.*?[LR](?:_pole)?\\K_",":",string,perl=TRUE),":")
[[1]]
[1] "SPG_L"           "subgenual_ACC_R"

[[2]]
[1] "SPG_R"      "MTG_L_pole"

[[3]]
[1] "MTG_L_pole"     "CerebellumGM_L"
0 голосов
/ 20 января 2020
split_again = function(x){
  if(length(x) > 1){
    return(x)
  }
  else{
    str_split(
      string = x,
      pattern = '(?<=[R|L])_', 
      n = 2)
  }
}
str_split(
  string = string,
  pattern = '(?<=pole)_', 
  n = 2) %>% 
  lapply(split_again) %>% 
  unlist()
...