正则表达式帮助将exp1 ^ exp2转换为pow(exp1,exp2)

时间:2009-03-13 15:14:08

标签: python c regex

我正在将一些matlab代码转换为C,目前我有一些使用^的权限,这对于\(?(\w*)\)?\^\(?(\w*)\)?

中的某些内容很容易做到 使用python (glambda)^(galpha)

中的子例程,

可以很好地转换pattern.sub(pow(\g<1>,\g<2>),'(glambda)^(galpha)')

我的问题是嵌套的括号

所以我有一个字符串:

glambdastar^(1-(1-gphi)*galpha)*(glambdaq)^(-(1-gphi)*galpha);

我无法弄清楚如何将该行转换为:

pow(glambdastar,(1-(1-gphi)*galpha))*pow(glambdaq,-(1-gphi)*galpha));

5 个答案:

答案 0 :(得分:2)

不幸的是,正则表达式不是处理嵌套结构的正确工具。有一些正则表达式引擎(如.NET)对递归有一些支持,但大多数 - 包括Python引擎 - 都没有,并且只能处理嵌入到表达式中的嵌套级别(快速变得难看) )。

您真正需要的是一个简单的解析器。例如,迭代计算括号的字符串并将其位置存储在列表中。当您找到^字符时,将最近关闭的括号组放入“左”变量,然后观察由下一个左括号形成的组。关闭时,将其用作“正确”值并打印pow(left, right)表达式。

答案 1 :(得分:1)

我认为你可以在这里使用递归。

找出左右部分后,再将其中的每一部分传递给您的函数。 基本情况是找不到^运算符,因此您不需要将pow()函数添加到结果字符串中。

该函数将返回一个包含所有正确pow()的字符串。 如果你愿意,我会想出一个例子。

答案 2 :(得分:0)

嵌套括号不能用正则表达式来描述,并且需要一个完整的解析器(能够理解语法,这比正则表达式更强大)。我不认为有解决方案。

答案 3 :(得分:0)

参见最近的讨论function-parser-with-regex-in-python(许多类似讨论之一)。然后按照建议pyparsing

答案 4 :(得分:0)

另一种方法是迭代直到所有^都已用尽。没有?

Ruby代码:

# assuming str contains the string of data with the expressions you wish to convert
while str.include?('^')
  str!.gsub!(/(\w+)\^(\w+)/, 'pow(\1,\2)')
end