正则表达式在R中提取函数参数

时间:2017-10-20 04:00:51

标签: r regex

我在R中提取函数参数时遇到问题。

    x="theme(legend.position='bottom', 
    legend.margin=(t=0,r=0,b=0,l=0,unit='mm'), 
    legend.background=element_rect(fill='red',size=rel(1.5)), 
    panel.background=element_rect(fill='red'),
    legend.position='bottom')"

我想要的是:

[1]legend.position='bottom'
[2]legend.margin=(t=0,r=0,b=0,l=0,unit='mm')
[3]legend.background=element_rect(fill='red',size=rel(1.5))
[4]panel.background=element_rect(fill='red')
[5]legend.position='bottom'

我尝试了几个正则表达式但没有成功,包括以下内容:

strsplit(x,",(?![^()]*\\))",perl=TRUE)

请帮帮我!

3 个答案:

答案 0 :(得分:1)

我认为这里最好的答案可能是尝试使用正则表达式来解析函数调用。顾名思义,正则表达式需要常规语言。您的函数调用不常规,因为它具有嵌套括号。我目前看到最大嵌套深度为2,但是谁知道在某些时候这可能会变得更深。

我建议改为编写一个简单的解析器。您可以在此处使用堆栈来跟踪括号。如果所有括号都关闭,你只会关闭一个参数,这意味着你不在参数的中间,除了可能是第一个参数。

答案 1 :(得分:0)

Arf,我真的很抱歉,但我必须继续工作,我会在以后继续,但现在我只是让我的方式部分地解决它:theme\(([a-z.]*=['a-z]*)|([a-z._]*=[a-z0-9=,'_.()]*)*\,\)?

它只错过了最后一部分..

此处为regex101页面:https://regex101.com/r/BZpcW0/2

稍后见。

答案 2 :(得分:0)

感谢您的所有建议。我已经解析了句子并将参数作为列表。这是我的解决方案。

x<-"theme(legend.margin=margin(t=0,r=0,b=0,l=0,unit='mm'),
legend.background=element_rect(fill='red',size=rel(1.5)),
panel.background=element_rect(fill='red'),
legend.position='bottom')" 

extractArgs=function(x){

result<-tryCatch(eval(parse(text=x)),error=function(e) return("error"))

if("character" %in% class(result)){
    args=character(0)
} else {
    if(length(names(result)>0)){
       pos=unlist(str_locate_all(x,names(result)))
       pos=c(sort(pos[seq(1,length(pos),by=2)]),nchar(x)+1)

       args=c()
       for(i in 1:(length(pos)-1)){
         args=c(args,substring(x,pos[i],lead(pos)[i]-2))
       } 

  } else{
      args=character(0)
  }
}
args
}