Python:用不同的术语

时间:2017-05-09 16:57:52

标签: python string

我有一堆方程式(来自Eviews)我需要解析并转换成另一种语言。它们作为字符串导入,例如:

a = "series1=0.173*d(series1,0,1)+0.010*d(series2,0,2)"

我遇到的问题是替换等式中的嵌入式eviews函数。我需要找到一种方法来转换" d(series2,0,1)" Eviews功能为另一种语言可读的格式。具体来说,

"d(series2,0,x)" --> "(series2 - series2(-x))"

理想情况下,我希望能够编写一个带有方程式字符串的函数(如上面第一行所示),检测方程式是否为" d(系列,0,x) "在其中起作用,然后根据上面的例子将其替换为等式。 e.g。

a = "series1=0.173*d(series1,0,1)+0.010*d(series2,0,2)"

def function(a):
    blah blah

function(a) --> "series1=0.173*(series1 - series1(-1))+0.010*(series2 - series2(-2))"

任何人都知道如何开始?

1 个答案:

答案 0 :(得分:1)

我认为你可以使用两个标准工具毫不费力地做到这一点:正则表达式和字符串格式化。但是,如果它比你的例子复杂得多,那么通过正则表达式进行解析可能会变得很难看,并且你可能会对具有解析语言的正式结构模型的系统做得更好。

首先,你想要import re,然后制作一个与你正在寻找的函数字符串相匹配的正则表达式,并将变量部分放入组中进行提取。对于您提到的案例,这是一个简单的例子:

>>> regex = re.compile(r'd\((\w+),\d+,(\d+)\)')
>>> arg_sets = regex.findall(a)
>>> arg_sets
[('series1', '1'), ('series2', '2')]

Here's python正则表达式的官方文档,以及可以帮助你构建它们的a tool(还有其他的,也就是我发现的第一个)用python模式)。

获得正则表达式后,您可以使用格式字符串中的结果来获得所需的输出,例如

>>> format_string = "({first} - {first}(-{third}))"
>>> format_string.format( **dict(zip(['first', 'third'], arg_sets[0])))
'(series1 - series1(-1))'