R 中的正则表达式 strsplit 表达式,因此它仅适用于每个字符串中特定字符的第一次出现?

标签 r regex 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”后分割字符串元素,并且只分割每个字符串元素一次?

最佳答案

我建议使用匹配方法

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

请参阅regex demo

详细信息

  • ^ - 字符串开头
  • (.*?[RL](?:_pole)?) - 第 1 组:
    • .*? - 除换行符之外的任何零个或多个字符,尽可能少
    • [RL](?:_pole)? - RL(可选)后跟 _pole<
  • _ - 下划线
  • (.*) - 第 2 组:除换行符之外的任何零个或多个字符(尽可能多)

参见the R demo :

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"

关于R 中的正则表达式 strsplit 表达式,因此它仅适用于每个字符串中特定字符的第一次出现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59829649/

相关文章:

r - 从另一个引用级别获取模型估计值,而无需运行新模型?

R:计算字符串列表中的所有组合(特定顺序)

regex - VB.Net正则表达式,获取可能包含单引号的单词,即单引号之间的单词

Python - 在字符串中定位正则表达式匹配的位置?

期望中的正则表达式?

r - 根据观察复制和修改数据帧的行 [R]

sqldf 删除观测值故障

R:ddply重复年度累计数据

r - 如何在 R 中应用多参数函数?