如何在R中使用sub函数从list_1提取目标分段字段?
解决R中sub函数适配不同字符串格式的问题
先拆解你之前使用的正则逻辑
你用来处理list_2的正则^.*_(\\d+_\\d+)_.*$,具体含义是:
^:定位到字符串开头.*:贪婪匹配任意数量的任意字符(除换行)_:匹配一个下划线(\\d+_\\d+):捕获组,匹配「1个以上数字+下划线+1个以上数字」的组合,也就是你要的Var1(比如0_300)_:再匹配一个下划线.*$:匹配剩余所有字符直到字符串结尾- 替换为
\\1:表示用第一个捕获组的内容替换整个字符串,也就是提取出Var1
这个正则能在list_2生效,是因为list_2的字符串格式是area_xxx_xxx_xxx,Var1刚好夹在两个下划线中间。但list_1的字符串结构是as.factor(radius_ring)xxx:as.factor(year_delta)yyy:units,和list_2完全不同,所以原正则无法匹配。
针对list_1的提取方案
提取Var1(如0_300、800_1000)
观察list_1的结构,Var1位于最后一个)和第一个:之间,且格式固定为「数字+下划线+数字」,用以下正则即可:
var1_working_list1 <- sub("^.*\\)(\\d+_\\d+):.*$", "\\1", list_1)
正则解释:
^.*\\):贪婪匹配从开头到最后一个)的所有内容(因为.*会优先匹配到最远的))(\\d+_\\d+):捕获目标Var1内容:.*$:匹配从:到字符串结尾的所有内容- 替换为
\\1,直接提取捕获到的Var1
提取Var2(如0、m5)
Var2位于year_delta)和:units之间,格式为「数字」或「m+数字」,用以下正则:
var2_working_list1 <- sub("^.*year_delta\\)([^:]+):units$", "\\1", list_1)
正则解释:
^.*year_delta\\):匹配从开头到year_delta)的所有内容([^:]+):捕获任意非:的字符(直到遇到下一个:),也就是Var2的内容:units$:匹配结尾固定的:units- 替换为
\\1,提取出Var2
验证效果
运行代码后可以得到预期结果:
# 查看前几个Var1 head(var1_working_list1) # 输出:"0_300" "300_600" "600_800" "800_1000" "0_300" "300_600" # 查看最后几个Var2 tail(var2_working_list1) # 输出:"m4" "m4" "m4" "m4" "m5" "m5"
内容的提问来源于stack exchange,提问作者Tom Benson
相关产品推荐
相关产品推荐

