我将尝试解析生物序列中的特定语法。这些位置可以具有以下形式:
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返回一个嵌套的字典(并且仅限于此)?
如何获得范围末尾的可选性和位置偏移量?位置规则中的Or()无法解决这个问题。(我同样尝试了范围末尾的类似方法)。理想情况下,我将所有位置都视为最复杂形式的特殊情况(即{ start: {base, end}, end: { base, end } }),其中简单情况使用0或None。
谢谢!
Or
、And
、MatchFirst
和Each
都将表达式列表作为它们的参数,而不仅仅是表达式。这就是为什么我更喜欢运算符重载:expr1 + expr2 | expr3
比MatchFirst([And([expr1,expr2]), expr3])
更易于理解。 - PaulMcG