生物学的シーケンスの位置の特定の構文を解析しようとしています。位置には次のような形式があります。
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 を使用していくつかの刺し傷を作成しました。ここに1つあります:
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)]})}
2 つの質問:
asDict() は、ルートの parseResult でのみ機能しました。ネストされた dict を返すように pyparsing を甘やかす方法はありますか (そしてそれだけです)?
範囲の終わりと位置のオフセットのオプションを取得するにはどうすればよいですか? 位置ルールの Or() はそれをカットしません。(範囲の終わりについても同様に試しました。) 理想的には、すべての位置を最も複雑な形式 (つまり、{ start: {base, end}, end: { base, end } }) の特殊なケースとして扱います。単純なケースでは 0 または None を使用します。)
ありがとう!