我还没有使用正则表达式很长一段时间,所以我不确定我能做什么就能完成"直接"或者如果我必须解决。
我的表达式如下:
crb_gdp_g_100000_16_16_ftv_all.txt
crt_r_g_25000_20_40_flin_g_2.txt
只有用星号代替的部分是"变化",其他东西是不变的(或者不相关,如在最后一部分的情况下(" f * _"之后) :
cr*_*_g_*_*_*_f*_
是否有直接的方式来获取星号部分的值?例如。如果是" r"或" gdp"我必须包含下划线,否则我在表达式的开头得到r。包括下划线给出" r "或" gdp ",但我只想要" r"或" gdp"。
或简而言之:我对表达方式了解很多,但我只想提取不同的部分。 (怎么样)我能这样做吗?
答案 0 :(得分:3)
您可以sub
使用捕获,然后使用strsplit
获取已分隔元素的列表:
str <- c("crb_gdp_g_100000_16_16_ftv_all.txt", "crt_r_g_25000_20_40_flin_g_2.txt")
strsplit(sub("cr([[:alnum:]]+)_([[:alnum:]]+)_g_([[:alnum:]]+)_([[:alnum:]]+)_([[:alnum:]]+)_f([[:alnum:]]+)_.+", "\\1.\\2.\\3.\\4.\\5.\\6", str), "\\.")
#[[1]]
#[1] "b" "gdp" "100000" "16" "16" "tv"
#[[2]]
#[1] "t" "r" "25000" "20" "40" "lin"
注意:我将\\w
替换为[[:alnum:]]
,以避免包含下划线。
答案 1 :(得分:2)
我们也可以使用regmatches
和regexec
来提取这些值:
regmatches(str, regexec("^cr([^_]+)_([^_]+)_g_([^_]+)_([^_]+)_([^_]+)_f([^_]+)_.*$", str))
[[1]]
[1] "crb_gdp_g_100000_16_16_ftv_all.txt" "b"
[3] "gdp" "100000"
[5] "16" "16"
[7] "tv"
[[2]]
[1] "crt_r_g_25000_20_40_flin_g_2.txt" "t" "r"
[4] "25000" "20" "40"
[7] "lin"
请注意,每个向量中的第一个元素是完整字符串,因此要删除它,我们可以使用lapply
和"["
lapply(regmatches(str,
regexec("^cr([^_]+)_([^_]+)_g_([^_]+)_([^_]+)_([^_]+)_f([^_]+)_.*$", str)),
"[", -1)
[[1]]
[1] "b" "gdp" "100000" "16" "16" "tv"
[[2]]
[1] "t" "r" "25000" "20" "40" "lin"