我观察到以下角色:
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)"
不幸的是,我还没有找到解决问题的正确方法。任何人都知道怎么可能获得这样一个重要的分裂?
答案 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)"