一些常规的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 = """\n12
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
印刷品:
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