首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在数学表达式中用C的power语法替换^(幂)符号

在数学表达式中用C的power语法替换^(幂)符号
EN

Stack Overflow用户
提问于 2016-11-15 17:51:45
回答 1查看 1.3K关注 0票数 15

我有一个数学表达式,例如:

代码语言:javascript
复制
((2-x+3)^2+(x-5+7)^10)^0.5

我需要把C语言的pow函数的^符号替换掉。我认为正则表达式是我需要的,但我不知道像专业人士那样的正则表达式。所以我最终使用了这个正则表达式:

代码语言:javascript
复制
(\([^()]*)*(\s*\([^()]*\)\s*)+([^()]*\))*

我不知道如何改善这一点。你能给我一些建议来解决那个问题吗?

预期输出:

代码语言:javascript
复制
pow(pow(2-x+3,2)+pow(x-5+7,10),0.5)
EN

回答 1

Stack Overflow用户

发布于 2016-11-15 19:48:28

下面是一个使用R解析器的示例(使用getParseData函数):

代码语言:javascript
复制
# helper function which turns getParseData result back to a text expression
recreateExpr <- function(DF,parent=0){
  elements <- DF[DF$parent == parent,]
  s <- ""
  for(i in 1:nrow(elements)){
    element <- elements[i,]
    if(element$terminal)
      s <- paste0(s,element$text)
    else
      s <- paste0(s,recreateExpr(DF,element$id))
  }
  return(s)  
}

expr <- "((2-x+3)^2+(x-5+7)^10)^0.5"

DF <- getParseData(parse(text=expr))[,c('id','parent','token','terminal','text')]

# let's find the parents of all '^' expressions
parentsOfPow <- unique(DF[DF$token == "'^'",'parent'])

# replace all the the 'x^y' expressions with 'pow(x,y)' 
for(p in parentsOfPow){
  idxs <- which(DF$parent == p)
  if(length(idxs) != 3){ stop('expression with '^' is not correct')  }

  idxtok1 <- idxs[1]
  idxtok2 <- idxs[2]
  idxtok3 <- idxs[3]

  # replace '^' token with 'pow'
  DF[idxtok2,c('token','text')] <- c('pow','pow')

  # move 'pow' token as first token in the expression
  tmp <- DF[idxtok1,]
  DF[idxtok1,] <- DF[idxtok2,]
  DF[idxtok2,] <- tmp

  # insert new terminals '(' ')' and ','
  DF <- rbind(
    DF[1:(idxtok2-1),],
    data.frame(id=max(DF$id)+1,parent=p,token=',',terminal=TRUE,text='(',
               stringsAsFactors=FALSE),
    DF[idxtok2,],
    data.frame(id=max(DF$id)+2,parent=p,token=',',terminal=TRUE,text=',',
               stringsAsFactors=FALSE),
    DF[(idxtok2+1):idxtok3,],
    data.frame(id=max(DF$id)+3,parent=p,token=')',terminal=TRUE,text=')',
               stringsAsFactors=FALSE),
    if(idxtok3<nrow(DF)) DF[(idxtok3+1):nrow(DF),] else NULL
  )
}

# print the new expression
recreateExpr(DF)

> [1] "pow((pow((2-x+3),2)+pow((x-5+7),10)),0.5)"
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40606723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档