python中用于完成过滤任务的解析器

python中用于完成过滤任务的解析器,python,parsing,text-parsing,Python,Parsing,Text Parsing,作为一个练习,我感兴趣的是用python编写一个小解析器,它可以使用一组潜在的标记、运算符和括号,这样我就可以指定如下内容: (DP>10) & (LowMQ[0] < 0.05) & (SPV < 0.05) (DP>10)和(低MQ[0]>src=“(DP>10)和(低MQ[0]>打印'\n'.join(textwrap.wrap(ast.dump(ast.parse(src)),宽度=80)) 模块(body=[Expr(value=BinOp)(lef

作为一个练习,我感兴趣的是用python编写一个小解析器,它可以使用一组潜在的标记、运算符和括号,这样我就可以指定如下内容:

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

我需要解析出标记DP、LowMQ和SPV以及操作符和操作顺序。我在Java中经常看到这种情况,但在python中没有看到。关于从哪里开始或一些示例代码有什么建议吗?

Yapps看起来很有希望

由于您的语法是Python语法的一个子集,因此可以使用Python的内置:

导入ast,文本换行 >>>src=“(DP>10)和(低MQ[0]<0.05)和(SPV<0.05)” >>>打印'\n'.join(textwrap.wrap(ast.dump(ast.parse(src)),宽度=80)) 模块(body=[Expr(value=BinOp)(left=BinOp)(left=Compare)(left=Name)(id=DP), ctx=Load()),ops=[Gt()],比较器=[Num(n=10)],op=BitAnd(), 右=比较(左=下标(值=名称(id='LowMQ',ctx=Load()), slice=Index(value=Num(n=0)),ctx=Load(),ops=[Lt()], 比较器=[Num(n=0.05000000000000003)]),op=BitAnd(), 右=比较(左=名称(id='SPV',ctx=Load()),操作=[Lt()], 比较器=[Num(n=0.05000000000000003)]) 无法解决一般情况,但非常简单。

使用和定义描述特定领域语言的语法应该可以。
>>> 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)])))])