Saa*_*mer 3 python parsing pyparsing
我想将“ pyparsing”解析结果作为字典显示出来,而无需进行后期处理。为此,我需要定义自己的密钥字符串。以下我能想到的最好的方法可以产生预期的结果。
要解析的行:
%ADD22C,0.35X*%
Run Code Online (Sandbox Code Playgroud)
码:
import pyparsing as pyp
floatnum = pyp.Regex(r'([\d\.]+)')
comma = pyp.Literal(',').suppress()
cmd_app_def = pyp.Literal('AD').setParseAction(pyp.replaceWith('aperture-definition'))
cmd_app_def_opt_circ = pyp.Group(pyp.Literal('C') +
comma).setParseAction(pyp.replaceWith('circle'))
circular_apperture = pyp.Group(cmd_app_def_opt_circ +
pyp.Group(pyp.Empty().setParseAction(pyp.replaceWith('diameter')) + floatnum) +
pyp.Literal('X').suppress())
<the grammar for the entire line>
Run Code Online (Sandbox Code Playgroud)
结果是:
['aperture-definition', '20', ['circle', ['diameter', '0.35']]]
Run Code Online (Sandbox Code Playgroud)
我认为这里的黑客是
pyp.Empty().setParseAction(pyp.replaceWith('diameter'))
Run Code Online (Sandbox Code Playgroud)
它始终匹配并且为空,但是随后我为其分配了所需的密钥名称。
这是最好的方法吗?我是否在滥用pyparsing来做本不该做的事情?
如果要命名为floatnum“直径”,则可以使用命名结果:
cmd_app_def_opt_circ = pyp.Group(pyp.Literal('C') +
comma)("circle")
circular_apperture = pyp.Group(cmd_app_def_opt_circ +
pyp.Group(floatnum)("diameter") +
pyp.Literal('X').suppress())
Run Code Online (Sandbox Code Playgroud)
这样,每次解析floatnum在circular_appertur上下文中遇到时,该结果都被命名为diameter。同样,如上所述,您可以circle用相同的方式命名。这对您有用吗?
| 归档时间: |
|
| 查看次数: |
298 次 |
| 最近记录: |