2

我有一个小型解析项目*,病理学家将他们的诊断记录在电子记录中。他们中的绝大多数使用“GLEASON SCORE: 3+4=7”的形式,但是,有很多关于它的即兴演奏。我不太明白如何应对的一个是“GLEASON SCORE: 7=3+4”

到目前为止,我的语法一直是

gleason = Group("GLEASON" + Optional("SCORE") + Optional("GRADE") + Optional("PATTERN") + Optional(":") + num("left") + "+" + num("right") + Optional("=") + Optional("total"))

我尝试添加

... + Optional(":") + Optional(num("total")) + Optional("=") + ...

在“left”变量之前,但它只找到丢失的记录,而不是所有记录。我需要搜索模式 A (a+b=c) 或模式 B (c=a+b)。我怎么能在pyparsing中做到这一点?


4

2 回答 2

3

不要使用 nums 和 '+'s 来滚动你自己的算术表达式,而是使用 pyparsing'soperatorPrecedence轻松定义一个 4 函数算术表达式:

arith_expr = operatorPrecedence(num,
    [
    (oneOf('-'), 1, opAssoc.RIGHT),
    (oneOf('* /'), 2, opAssoc.LEFT),
    (oneOf('+ -'), 2, opAssoc.LEFT),
    ])

然后替换num("left") + "+" + num("right") + Optional("=") + Optional(num)("total")为:

arith_expr('lhs') + Optional('=' + arith_expr('rhs'))

现在您将能够解析任何算术表达式,包括带有嵌套括号的表达式,而不仅仅是 'x+y=z' 类型的表达式。

于 2012-09-26T06:14:04.347 回答
2
>>> eqn = Word(alphas,exact=1)+"+"+Word(alphas,exact=1)+"="+Word(alphas,exact=1)

>>> eqn2 = Word(alphas,exact=1)+"="+Word(alphas,exact=1)+"+"+Word(alphas,exact=1
)
>>> equation = eqn|eqn2
>>> equation.parseString("A+b=c")
(['A', '+', 'b', '=', 'c'], {})
>>> equation.parseString("A=b+c")
(['A', '=', 'b', '+', 'c'], {})
>>> equation.parseString("A=b-c")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python26\lib\site-packages\pyparsing.py", line 1032, in parseString
    raise exc
pyparsing.ParseException: Expected "+" (at char 3), (line:1, col:4)
于 2012-09-26T05:57:13.437 回答