我正在尝试使用 pyparsing 来解析可能嵌套的化学式,并且使用 pyparsing 具有非整数化学计量。我想要的是公式中存在的每个元素的列表及其相应的总化学计量。
我已经使用 pyparsing wiki 上的示例作为开始,并查看了fourFn.py 以获得更多想法。我无法理解如何使用包中的所有功能。
我想出了以下语法:
from pyparsing import Word, Group, ZeroOrMore, Combine,\
Optional, OneOrMore, ParseException, Literal, nums,\
Suppress, Dict, Forward
caps = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
lowers = caps.lower()
digits = "0123456789"
integer = Word( digits )
parl = Literal("(").suppress()
parr = Literal(")").suppress()
element = Word( caps, lowers )
separator = Literal( "," ).setParseAction(lambda s,l,t: t[0].replace(',','.')) | Literal( "." )
nreal = (Combine( integer + Optional( separator +\
Optional( integer ) ))\
| Combine( separator + integer )).setParseAction( lambda s,l,t: [ float(t[0]) ] )
block = Forward()
groupElem = Group( element + Optional( nreal, default=1)) ^ \
Group( parl + block + parr + Optional( nreal,default=1 ) )
block << groupElem + ZeroOrMore( groupElem )
formula = OneOrMore( block )
非嵌套公式按预期工作:
>>> formula.parseString('H2O')
([(['H', 2.0], {}), (['O', 1], {})], {})
尽管有那些空字段(我找不到用途),但我可以提取我想要的信息。
但是当我尝试类似的事情时:
>>> formula.parseString('C6H8(OH)4')
([(['C', 6.0], {}), (['H', 8.0], {}), ([(['O', 1], {}), (['H', 1], {}), 4.0], {})], {})
我可以看到公式已正确解析,但我希望 (OH)4 中的外部“4”乘以内部数字。但我看不出该怎么做。
一种代币如何改变另一种代币的价值?
或者我如何遍历这些结果并创建一个函数,如果一个块附加了一个外部数字,我可以计算块内每个元素的总数?
提前致谢。
编辑1:我相信我需要类似的东西:在出现“(块)nreal”时抑制外部nreal,并将所有出现的nreal乘以外部值......