正则表达式,提取模式的特定部分

时间:2017-07-20 12:51:38

标签: r regex

我还没有使用正则表达式很长一段时间,所以我不确定我能做什么就能完成"直接"或者如果我必须解决。

我的表达式如下:

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"。

或简而言之:我对表达方式了解很多,但我只想提取不同的部分。 (怎么样)我能这样做吗?

2 个答案:

答案 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)

我们也可以使用regmatchesregexec来提取这些值:

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"