我有一个名为 PATTERN 的字符串:
PATTERN <- "MODEL_Name.model-OUTCOME_any.outcome-IMP_number"
我想使用模式匹配函数解析字符串,例如grep
,sub
,...以获取等于 MODEL >&#34; Name.model&#34; ,字符串变量 OUTCOME 等于&#34; any.outcome&#34; 和整数变量 IMP 等于数字。
如果 MODEL , OUTCOME 和 IMP 都是整数,我可以使用函数sub
获取值:
PATTERN <- "MODEL_002-OUTCOME_007-IMP_001"
pattern_build <- "MODEL_([0-9]+)-OUTCOME_([0-9]+)-IMP_([0-9]+)"
MODEL <- as.integer(sub(pattern_build, "\\1", PATTERN))
OUTCOME <- as.integer(sub(pattern_build, "\\2", PATTERN))
IMP <- as.integer(sub(pattern_build, "\\3", PATTERN))
您是否知道如何匹配变量 PATTERN 中包含的字符串?
可能棘手的模式是:
PATTERN <- "MODEL_PS2-OUTCOME_stroke_i-IMP_001"
PATTERN <- "MODEL_linear-model-OUTCOME_stroke_i-IMP_001"
答案 0 :(得分:4)
一种解决方案,它也能够应对“棘手”的问题。图案:
PATTERN <- "MODEL_linear-model-OUTCOME_stroke_i-IMP_001"
lst <- strsplit(PATTERN, '([A-Z]+_)')[[1]][2:4]
lst <- sub('-$','',lst)
给出:
> lst
[1] "linear-model" "stroke_i" "001"
如果你想在数据帧中使用它:
df <- as.data.frame.list(lst)
names(df) <- c('MODEL','OUTCOME','IMP')
给出:
> df
MODEL OUTCOME IMP
1 linear-model stroke_i 001
答案 1 :(得分:3)
最小正则表达式方法,
sapply(strsplit(PATTERN, '-'), function(i) sub('(.*?_){1}', '', i))
# [,1]
#[1,] "PS2"
#[2,] "stroke_i"
#[3,] "001"
答案 2 :(得分:1)
您可以使用捕获组匹配任何字符的模式,在已知的分隔子字符串之间尽可能少:
MODEL_(.*?)-OUTCOME_(.*?)-IMP_(.*)
请参阅regex demo。请注意,最后一个.*
是贪婪的,因为您将所有其余字符串都捕获到此捕获中。
您可以将此模式精确到仅允许匹配预期字符(例如,将数字匹配到最后一个捕获组,使用([0-9]+)
而不是(.*)
。
将其与 stringr 中的str_match
一起使用:
> library(stringr)
> x <- "MODEL_Name.model-OUTCOME_any.outcome-IMP_number"
> res <- str_match(x, "MODEL_(.*?)-OUTCOME_(.*?)-IMP_(.*)")
> res[,2]
[1] "Name.model"
> res[,3]
[1] "any.outcome"
> res[,4]
[1] "number"
>
使用相同正则表达式的基本R解决方案将涉及regmatches
/ regexec
:
> res <- regmatches(x, regexec("MODEL_(.*?)-OUTCOME_(.*?)-IMP_(.*)", x))[[1]]
> res[2]
[1] "Name.model"
> res[3]
[1] "any.outcome"
> res[4]
[1] "number"
>