首页 > 解决方案 > R中的正则表达式strsplit表达式,所以它只适用于每个字符串中特定字符的第一次出现?

问题描述

我有一个充满字符串的列表: 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”后跟“pole”,然后它在第一次出现“pole”之后拆分字符串元素并且只拆分每个字符串元素一次?

标签: rregexstrsplit

解决方案


我建议使用匹配方法

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

查看正则表达式演示

细节

  • ^- 字符串的开始
  • (.*?[RL](?:_pole)?)- 第 1 组:
    • .*?- 尽可能少的除换行符以外的任何零个或多个字符
    • [RL](?:_pole)?- RL可选地跟随_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"

推荐阅读