将角色分成部分

时间:2016-06-14 12:02:15

标签: r gsub substr grepl

我观察到以下角色:

  l <- "mod, range1 = seq(-m, n, 0.1), range2 = seq(-2, 2, 0.1), range3 = seq(-2, 2, 0.1)"

在R中使用正则表达式我希望在以下结构中分割l

[1] "mod"                      "range1 = seq(-m, n, 0.1)"
[3] "range2 = seq(-2, 2, 0.1)" "range3 = seq(-2, 2, 0.1)"

不幸的是,我还没有找到解决问题的正确方法。任何人都知道怎么可能获得这样一个重要的分裂?

3 个答案:

答案 0 :(得分:5)

我真的怀疑你能用正则表达式做到这一点。您正在尝试解析您的字符串,因此您需要一个解析器,它通常比正则表达式更强大。我认为它不够通用,但您可以利用R解析器和alist类。尝试:

res<-eval(parse(text=paste0("alist(",l,")")))
paste0(names(res),ifelse(names(res)!="","=",""),as.character(res))
#[1] "mod"                    "range1=seq(-m, n, 0.1)" "range2=seq(-2, 2, 0.1)"
#[4] "range3=seq(-2, 2, 0.1)"

请记住,如果存在嵌套括号,则正则表达式建议的解决方案会失败。尝试使用它们并使用:

l<-"mod, range1 = seq(-m, n, 0.1), range2 = seq(-2, exp(2), 0.1), range3 = seq(-2, 2, 0.1)"

了解我的意思。

答案 1 :(得分:4)

基于this regex,您可以使用str_extract_all中的stringr

library(stringr)
str_extract_all(l, '(?:[^,(]|\\([^)]*\\))+')
#[[1]]
#[1] "mod" " range1 = seq(-m, n, 0.1)" " range2 = seq(-2, 2, 0.1)" " range3 = seq(-2, 2, 0.1)"

trimws(unlist(str_extract_all(l, '(?:[^,(]|\\([^)]*\\))+')))
#[1] "mod" "range1 = seq(-m, n, 0.1)" "range2 = seq(-2, 2, 0.1)" "range3 = seq(-2, 2, 0.1)"

答案 2 :(得分:3)

以下是基于OP帖子中显示的base R的{​​{1}}选项。在这里,我们匹配从pattern开始到(的所有字符,跳过它并按)分隔后跟空格。

,

更新

使用@ nicola的'l'

strsplit(l, "\\([^)]+\\)(*SKIP)(*F)|, ", perl = TRUE)[[1]]
#[1] "mod"                      "range1 = seq(-m, n, 0.1)"
#[3] "range2 = seq(-2, 2, 0.1)" "range3 = seq(-2, 2, 0.1)"

和之前的'l'

strsplit(l, ", (?=[[:alnum:]]+\\s+\\=)", perl = TRUE)[[1]]
#[1] "mod"                           "range1 = seq(-m, n, 0.1)"   
#[3]  "range2 = seq(-2, exp(2), 0.1)" "range3 = seq(-2, 2, 0.1)"