我正在将一些matlab代码转换为C,目前我有一些使用^的权限,这对于\(?(\w*)\)?\^\(?(\w*)\)?
(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));
答案 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