Используя pyparsing, мне нужно указать, что два выражения могут встречаться в любом порядке и в любом числе между двумя фигурными скобками. Ниже мой код., обрабатывая последовательность выражений pyparsing в любом порядке и числе
import pyparsing as pp
def updateList(someList):
def parseAction(str, loc, tokens):
someList.append(tokens[0])
return parseAction
msgNameList = []
ident = pp.Word(pp.alphanums + "_" + ".")
openBrace = pp.Suppress(pp.Literal("{"))
closeBrace = pp.Suppress(pp.Literal("}"))
fieldKw = pp.Keyword("field")
fieldExpr = fieldKw + ident + ident
msgKw = pp.Suppress(pp.Keyword("msg"))
msgName = ident.setParseAction(updateList(msgNameList))
msgExpr = pp.Forward()
msgBody = (openBrace + (pp.ZeroOrMore(fieldExpr) & pp.ZeroOrMore(msgExpr)) + closeBrace)
msgExpr << msgKw + msgName + pp.Optional(msgBody)
testStr1 = "msg msgNameA {msg msgNameAB {field type2 field2} field type1 field1}"
msgExpr.parseString(testStr1)
print msgNameList
msgNameList = []
testStr2 = "msg msgNameA {field type1 field1 msg msgNameAB {field type2 field2}}"
msgExpr.parseString(testStr2)
print msgNameList
, который производит этот выход:
['msgNameA', 'msgNameAB', 'type2', 'field2', 'type1', 'field1']
[]
Обратите внимание, что я добавляю к msgNameList только после разбора выражения msgName. (. Конечное выражение и анализировать функции для нее будет более сложным)
Выход я хочу, для обоих тестов струн:
['msgNameA', 'msgNameAB']
Я уверен, что мое выражение синтаксический для msgBody неверен, но Я не могу понять, как выразить то, что мне нужно, в pyparsing. В фигурных скобках msgExpr или fieldExpr могут возникать в любом порядке и в любом числе (msgExpr ... fieldExpr ... или fieldExpr ... msgExpr ...). Некоторые примеры:
- msgExpr msgExpr fieldExpr fieldExpr fieldExpr msgExpr
- fieldExpr msgExpr fieldExpr fieldExpr msgExpr fieldExpr
- msgExpr fieldExpr fieldExpr
Я знаю, что должен быть способ сделать это, но I` m не хватает.
Заранее спасибо
Я изменил Я попытался msgBody = openBrace + pp.ZeroOrMore (msgExpr | fieldExpr) + closeBrace, но это все еще не работает. Должно быть что-то еще мне не хватает. Я включил больше кода, потому что думал, что это может быть не проблема. – XYZ
@XYZ - вам нужно быть более конкретным в отношении этого выражения, которое «не работает». – PaulMcG
Ничего. У меня другая проблема, чем я думал. Спасибо – XYZ