如何从字符串

时间:2017-03-03 10:36:06

标签: r regex pattern-matching

我有一个名为 PATTERN 的字符串:

PATTERN <- "MODEL_Name.model-OUTCOME_any.outcome-IMP_number"

我想使用模式匹配函数解析字符串,例如grepsub,...以获取等于 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"

3 个答案:

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