一些一般的 pyparsing 技巧:
Or(expr, empty)
更好地写成Optional(expr)
。另外,你的 Or 表达式试图用 Empty 类创建一个 Or ,你可能想写Empty()
or empty
对于第二个参数。
expr.setResultsName("name")
现在可以写成expr("name")
如果您想将结构应用于结果,请使用Group
.
Use 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
Prints:
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