r - 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”之后拆分字符串元素并且只拆分每个字符串元素一次?
解决方案
我建议使用匹配方法
^(.*?[RL](?:_pole)?)_(.*)
查看正则表达式演示
细节
^
- 字符串的开始(.*?[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"
推荐阅读
- html - 如何修复多个模式屏幕和一个不显示
- ios - 检查 Swift 关联枚举上的单例不等式?错误:“条件中的变量绑定需要初始化程序”
- sqlconnection - 无法使用 java 的 SqlConnection 将数据插入 sql db
- c++ - arduino 看似 0 != 0
- javascript - 在 Rollup.js 中使用 jQuery DataTables
- ruby-on-rails - ActiveRecord cache_key 不会更改包含的表
- python-3.x - 如何在二维列表中搜索单个单词?
- r - 尽管在 RStudio 中工作,但 blogdown 未在 Netlify 中呈现
- javascript - 如果数组为空而不是使用带有箭头函数的 .find 方法未定义,如何返回“null”?
- python - 如何将此 Python for 循环转换为 Tensorflow(如果可能)