解析包含多项式

时间:2015-12-20 11:13:50

标签: parsing

你好经验丰富的pythoners。

目标只是读取我自己的文件,这些文件具有以下格式,然后对这些值和多项式应用数学运算。这些文件具有以下格式:

m1:=10:
m2:=30:
Z1:=1:
Z2:=-1:
...
Some very similar variables, next come the laguerre polynomials
...
F:= (12.58295)*L(0,x)*L(1,y)*L(6,z) + (30.19372)*L(0,x)*L(2,y)*L(2,z) - ...:

其中L代表laguerre多项式并且取两个参数。

我在Python中编写了一个程序,它使用" ="将每一行分成左右两侧分割。作为分隔符的角色。这些文件的格式始终相同,但F中的laguerre多项式的数量可能会有所不同。

import re
linestring = open("file.txt", "r").read()
linestring = re.sub("\n\n","\n",str(linestring))
linestring = re.sub(",\n",",",linestring)
linestring = re.sub("\\+\n","+",linestring)
linestring = re.sub(":=\n",":=",linestring)
linestring = re.sub(":\n","\n",linestring)
linestring = re.sub(":","",linestring)
LINES = linestring.split("\n")
for LINE in LINES:
   LINE = re.sub(" ","",LINE)
   print "LINE=", LINE
   if len(LINE) <=0:
      next
   PAIR = LINE.split("=")
   print "PAIR=", PAIR
   LHS = PAIR[0]
   RHS = PAIR[1]
   print "LHS=", LHS
   print "RHS=", RHS

第一个re.sub块只处理格式化文件并丢弃python无法处理的字符;然后执行一个循环来打印4个东西,LINE,PAIR,LHS和RHS,它做得很好。使用上面的示例文件,该过程将打印以下内容:

LINE= m1=1
PAIR= ['m1', '1']
LHS= m1
RHS= 1

LINE= m2=1
PAIR= ['m2', '1']
LHS= m2
RHS= 1

LINE= Z1=-1
PAIR= ['Z1', '-1']
LHS= Z1
RHS= -1

LINE= Z2=-1
PAIR= ['Z2', '-1']
LHS= Z2
RHS= -1

LINE= F= 12.5*L(0,x)L(1,y) + 30*L(0,x)L(2,y)L(2,z) 
PAIR=['F', '12.5*L(0,x)L(1,y) + 30*L(0,x)L(2,y)L(2,z)']
LHS= F
RHS= 12.5*L(0,x)L(1,y) + 30*L(0,x)L(2,y)L(2,z)

我的问题是处理此输出并在数学脚本中使用它的下一个最佳步骤是什么,特别是将L指定为laguerre多项式?我尝试将LHS和RHS放入字典中,但发现由于laguerre多项式将F放入其中很麻烦。

欢迎任何想法。也许我过于复杂了,并且有一种更简单的方法来解析这个文件。

非常感谢提前

1 个答案:

答案 0 :(得分:0)

您的解析算法似乎无法正常工作,因为您的变量的RHS不会产生预期的结果。 您想要格式化文件的第一个re.sub块似乎过于复杂。假设输入文件中的每个语句都以冒号结束,您可以删除所有空格和换行符,并使用以下代码分隔语句:

linestring = open('file.txt','r').read()
strippedstring = linestring.replace('\n','').replace(' ','')
statements = re.split(':(?!=)',strippedstring)[:-1]

然后迭代语句并将每个语句拆分为LHS和RHS:

for st in statements:
    lhs,rhs = re.split(':=',st)
    print 'lhs=',lhs
    print 'rhs=',rhs

在下一步中,尝试区分正常的浮点变量和多项式:

    #evaluate rhs
    try:
        #interpret as numeric constant
        f = float(rhs)
        print "    ",f
    except ValueError:
        #interpret as laguerre-polynomial
        summands = re.split('\+', re.sub('-','+-',rhs))
        for s in summands:
            m = re.match("^(?P<factor>-?[0-9]*(\.[0-9]*)?)(?P<poly>(\*?L\([0-9]+,[a-z]\))*)", s)
            if not m:
                print '    polynomial misformatted'
                continue
            f = m.group('factor')
            print '    factor: ',f
            p = m.group('poly')
            for l in re.finditer("L\((?P<a>[0-9]+),(?P<b>[a-z])\)",p):
                print '    poly: L(%s,%s)' % (l.group("a"),l.group("b"))

这适用于您给定的示例文件。