Parsing 解析包含多项式的输入文件

Parsing 解析包含多项式的输入文件,parsing,Parsing,你好,经验丰富的蟒蛇 目标只是读入我自己的文件,这些文件具有以下格式,然后对这些值和多项式应用数学运算。这些文件的格式如下: 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代表

你好,经验丰富的蟒蛇

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

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代表拉盖尔多项式,取两个参数

我已经用Python编写了一个过程,它使用“=”字符作为分隔符,将每一行分割成左侧和右侧。这些文件的格式总是相同的,但F中拉盖尔多项式的数量可能会有所不同

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
我的问题是,处理这个输出并在数学脚本中使用它的下一个最佳步骤是什么,特别是将L指定为拉盖尔多项式?我试着把LHS和RHS放进字典,但由于拉盖尔多项式的缘故,把F放进去很麻烦

欢迎提出任何意见。也许我把它复杂化了,有一种更简单的方法来解析这个文件


非常感谢您的解析算法似乎不能正常工作,因为变量的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"))
#评估rhs
尝试:
#解释为数值常量
f=浮动(rhs)
打印“”,f
除值错误外:
#解释为拉盖尔多项式
summands=re.split('\+',re.sub('-','+-',rhs))
对于总和中的s:
m=re.match(“^(?P-?[0-9]*(\[0-9]*)?)(?P(\*?L\([0-9]+,[a-z]\)*)”,s)
如果不是m:
打印“多项式格式错误”
持续
f=m.group(‘因子’)
打印“因子:”,f
p=m.group(‘poly’)
对于re.finditer中的l(“l\(?P[0-9]+),(?P[a-z])”,P):
打印“多边形:L(%s,%s)”(L.group(“a”)、L.group(“b”))

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

谢谢您的回复。解析器比我的尝试更优雅:)在到达多项式部分之前,它工作得很好。它与AttributeError一起出错:“非类型”对象没有属性“组”。我要求它打印m,当它到达F时,它确实打印了一个无结果。我意识到我没有完全正确地输入F,所以在原始帖子中做了一个小修改(就在拉盖尔夫妇之间)但是我不明白为什么这会引起一个大问题。显然,如果输入文件与正则表达式不匹配,我上面的代码就远远不够完美,而且很容易出错。我将在一秒钟内更新我的代码,以便它在拉盖尔夫妇之间与
*
一起工作。但是,如果输入文件有错误,并且正则表达式不匹配,您应该进行一些错误检查。非常感谢您的帮助。我不得不对创建这些输入文件的代码进行修改,现在括号中是每三个Laguerres开头的乘数。为了修改上面的Python代码,我以以下方式插入了两个转义括号\(和\):m=re.match(^\((?P-?[0-9]*(\.[0-9]*)?)\)。这会循环使用拉盖尔细数的三元组,但在系数有负号的情况下会崩溃,例如(-41.7694765)。有没有一个简单的方法来克服这个问题?再次感谢您的帮助。如果您决定将因子的符号包含在括号中,并且只使用
+
来加入多边形求和,您必须删除替换
+-
+
求和=re.split('\+',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"))