R 将角色拆分为多个部分
我注意到以下特点:R 将角色拆分为多个部分,r,gsub,substr,grepl,R,Gsub,Substr,Grepl,我注意到以下特点: l <- "mod, range1 = seq(-m, n, 0.1), range2 = seq(-2, 2, 0.1), range3 = seq(-2, 2, 0.1)" 不幸的是,我还没有找到克服这个问题的正确方法。任何人都知道如何获得这样一个Elegent split?基于,您可以使用str\u extract\u allfromstringr library(stringr) str_extract_all(l, '(?:[^,(]|\\([^)]*\
l <- "mod, range1 = seq(-m, n, 0.1), range2 = seq(-2, 2, 0.1), range3 = seq(-2, 2, 0.1)"
不幸的是,我还没有找到克服这个问题的正确方法。任何人都知道如何获得这样一个Elegent split?基于,您可以使用str\u extract\u all
fromstringr
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)"
或
下面是一个基于OP帖子中显示的
模式的base R
选项。这里我们匹配从(
到)
开始的所有字符,跳过它并按,
和空格分开
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
类。尝试:
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)"
请您解释一下split=“\\([^)]+\\)(*SKIP)(*F)|,”
的部分。这会很有帮助。很好的正则表达式,但不要认为它足够通用。尝试使用嵌套的()
。检查我的答案,看看它。@nicola你是对的。但是,我的正则表达式是基于OP的模式。我想正式语言理论家实际上可以证明没有正则表达式可以解决这个问题(或者我说的是假的,我根本不是这个领域的专家…。可能有与@akrun的解法相同的问题。@nicola,的确,如果使用嵌套的方括号,则会失败。我想知道为什么要尝试拆分存储在字符向量中的R代码。从表面上看,正如下面的评论所说,正则表达式可能不够强大,无法满足您的需要。你能为这个问题提供一些背景吗?回去告诉发起者不要写这种愚蠢的结构。让他把每一个声称的命令放在单独的一行上,例如,强制的fortune(106)
。我并不认为在这种情况下您有很多选择:-(.我试图递归地运行do.call(l[1:j])
,在成功时报告,适当地修剪l
并重复,但这几乎是代码所能得到的最丑陋的结果:-)。出于兴趣,是否有可以检查语法有效字符串的R
函数或包?@CarlWitthoft猜测您可以使用parse
,如果没有产生错误,字符串就是有效的。
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)"
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)"