【问题标题】:regular expression help with converting exp1^exp2 to pow(exp1, exp2)正则表达式有助于将 exp1^exp2 转换为 pow(exp1, exp2)
【发布时间】:2009-03-13 15:14:07
【问题描述】:

我正在将一些 matlab 代码转换为 C,目前我有一些行使用 ^ 具有强大的功能,这很容易用 \(?(\w*)\)?\^\(?(\w*)\)? 行来完成。

可以很好地转换(glambda)^(galpha),使用python中的子例程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));

【问题讨论】:

    标签: python c regex


    【解决方案1】:

    不幸的是,正则表达式不是处理嵌套结构的正确工具。有一些正则表达式引擎(例如 .NET)支持递归,但大多数(包括 Python 引擎)不支持,并且只能处理构建到表达式中的嵌套级别(这会很快变得丑陋) )。

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

    【讨论】:

      【解决方案2】:

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

      一旦你弄清楚左右部分,再次将它们传递给你的函数。 基本情况是找不到 ^ 运算符,因此您不需要将 pow() 函数添加到结果字符串中。

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

            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
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-03-15
              • 1970-01-01
              • 2011-10-02
              • 2016-04-02
              • 1970-01-01
              • 2019-05-11
              • 2014-11-08
              • 2017-12-29
              相关资源
              最近更新 更多