2012-09-26 26 views
0

作爲一個練習,我有興趣在python中編寫一個可以使用一組潛在標記,運算符和括號的小解析器,以便我可以指定這樣的東西:python中的解析器來完成過濾任務

(DP>10) & (LowMQ[0] < 0.05) & (SPV < 0.05) 

我需要解析標籤DP,LowMQ和SPV以及操作符和操作順序。我在Java中經常看到這樣做,但我沒有在python中看到過。任何關於從何處開始或提供示例代碼的建議?

+1

http://nedbatchelder.com/text/python-parsers.html – jfs

+1

使用[Pyarsing](http://pyparsing.wikispaces.com/)並定義描述您的域特定語言的語法應該可行。 –

回答

1

因爲你的語法是Python語法的一個子集,你可以使用Python的內置ast.parse

>>> import ast, textwrap 
>>> src = "(DP>10) & (LowMQ[0] < 0.05) & (SPV < 0.05)" 
>>> print '\n'.join(textwrap.wrap(ast.dump(ast.parse(src)), width=80)) 
Module(body=[Expr(value=BinOp(left=BinOp(left=Compare(left=Name(id='DP', 
ctx=Load()), ops=[Gt()], comparators=[Num(n=10)]), op=BitAnd(), 
right=Compare(left=Subscript(value=Name(id='LowMQ', ctx=Load()), 
slice=Index(value=Num(n=0)), ctx=Load()), ops=[Lt()], 
comparators=[Num(n=0.050000000000000003)])), op=BitAnd(), 
right=Compare(left=Name(id='SPV', ctx=Load()), ops=[Lt()], 
comparators=[Num(n=0.050000000000000003)])))]) 

不能解決一般情況下,但它是非常簡單的。