python-使用pyparsing解析嵌套结构
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-使用pyparsing解析嵌套结构,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3347字,纯文字阅读大概需要5分钟。
内容图文
![python-使用pyparsing解析嵌套结构](/upload/InfoBanner/zyjiaocheng/678/a7db938d4818400590f5f8a4bc2c764c.jpg)
我正在尝试解析生物序列中位置的特定语法.这些职位可以采用以下形式:
12 -- a simple position in the sequence
12+34 -- a complex position as a base (12) and offset(+34)
12_56 -- a range, from 12 to 56
12+34_56-78 -- a range as a start to end, where either or both may be simple or complex
我想将这些解析为字典,大致像这样:
12 -> { 'start': { 'base': 12, 'offset': 0 }, 'end': None }
12+34 -> { 'start': { 'base': 12, 'offset': 34 }, 'end': None }
12_56 -> { 'start': { 'base': 12, 'offset': 0 },
'end': { 'base': 56, 'offset': 0 } }
12+34_56-78 -> { 'start': { 'base': 12, 'offset': 0 },
'end': { 'base': 56, 'offset': -78 } }
我使用pyparsing进行了几次刺刺.这是一个:
from pyparsing import *
integer = Word(nums)
signed_integer = Word('+-', nums)
underscore = Suppress('_')
position = integer.setResultsName('base') + Or(signed_integer,Empty).setResultsName('offset')
interval = position.setResultsName('start') + Or(underscore + position,Empty).setResultsName('end')
结果接近我想要的:
In [20]: hgvspyparsing.interval.parseString('12-34_56+78').asDict()
Out[20]:
{'base': '56',
'end': (['56', '+78'], {'base': [('56', 0)], 'offset': [((['+78'], {}), 1)]}),
'offset': (['+78'], {}),
'start': (['12', '-34'], {'base': [('12', 0)], 'offset': [((['-34'], {}), 1)]})}
两个问题:
> asDict()仅适用于根parseResult.有没有办法哄骗pyparsing返回嵌套的dict(仅此)?
>如何获得范围末端和位置偏移的可选项?排名规则中的Or()不会削减它. (对于范围的结束,我也进行了类似的尝试.)理想情况下,我会将所有职位视为最复杂形式的特殊情况(即{开始:{base,end},end:{base,end}}),较简单的情况使用0或无.)
谢谢!
解决方法:
一些常规的pyparsing技巧:
Or(expr,empty)最好写成Optional(expr).另外,您的Or表达式试图使用类Empty创建一个Or,您可能打算为第二个参数编写Empty()或empty.
expr.setResultsName(“ name”)现在可以写成expr(“ name”)
如果要对结果应用结构,请使用“组”.
使用dump()而不是asDict()可以更好地查看解析结果的结构.
这是我如何建立您的表达方式:
from pyparsing import Word, nums, oneOf, Combine, Group, Optional
integer = Word(nums)
sign = oneOf("+ -")
signedInteger = Combine(sign + integer)
integerExpr = Group(integer("base") + Optional(signedInteger, default="0")("offset"))
integerRange = integerExpr("start") + Optional('_' + integerExpr("end"))
tests = """12
12+34
12_56
12+34_56-78""".splitlines()
for t in tests:
result = integerRange.parseString(t)
print t
print result.dump()
print result.asDict()
print result.start.base, result.start.offset
if result.end:
print result.end.base, result.end.offset
print
印刷品:
12
[['12', '0']]
- start: ['12', '0']
- base: 12
- offset: 0
{'start': (['12', '0'], {'base': [('12', 0)], 'offset': [('0', 1)]})}
12 0
12+34
[['12', '+34']]
- start: ['12', '+34']
- base: 12
- offset: +34
{'start': (['12', '+34'], {'base': [('12', 0)], 'offset': [('+34', 1)]})}
12 +34
12_56
[['12', '0'], '_', ['56', '0']]
- end: ['56', '0']
- base: 56
- offset: 0
- start: ['12', '0']
- base: 12
- offset: 0
{'start': (['12', '0'], {'base': [('12', 0)], 'offset': [('0', 1)]}), 'end': (['56', '0'], {'base': [('56', 0)], 'offset': [('0', 1)]})}
12 0
56 0
12+34_56-78
[['12', '+34'], '_', ['56', '-78']]
- end: ['56', '-78']
- base: 56
- offset: -78
- start: ['12', '+34']
- base: 12
- offset: +34
{'start': (['12', '+34'], {'base': [('12', 0)], 'offset': [('+34', 1)]}), 'end': (['56', '-78'], {'base': [('56', 0)], 'offset': [('-78', 1)]})}
12 +34
56 -78
内容总结
以上是互联网集市为您收集整理的python-使用pyparsing解析嵌套结构全部内容,希望文章能够帮你解决python-使用pyparsing解析嵌套结构所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。