将角色拆分成多个部分

Spliting the character into parts

我观察到以下字符:

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

不幸的是,我还没有找到解决问题的合适方法。任何人都知道如何获得如此优雅的拆分?

基于 this regex,您可以使用 stringr

中的 str_extract_all
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)"

这是一个基于 OP post 中显示的 patternbase R 选项。这里我们匹配所有从 ( 开始到 ) 的字符,跳过它并按 , 拆分,然后是 space.

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

更新

使用@nicola 的'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)" 

和之前的'l'

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

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

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

理解我的意思。