2016-08-12 4 views
3

Используя 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 ...). Некоторые примеры:

  1. msgExpr msgExpr fieldExpr fieldExpr fieldExpr msgExpr
  2. fieldExpr msgExpr fieldExpr fieldExpr msgExpr fieldExpr
  3. msgExpr fieldExpr fieldExpr

Я знаю, что должен быть способ сделать это, но I` m не хватает.

Заранее спасибо

ответ

2

(Во-первых, в будущем, пожалуйста, подготовить MCVE вашего вопроса. Суть вашего вопроса

Использование Pyparsing, мне нужно, чтобы указать, что два выражения могут произойти в любом порядке и в любом количестве между двумя фигурными скобками. Ниже мой код.

поэтому подготовьте вопрос, содержащий только достаточно деталей для этого.)

Предположим, мы начинаем с

from pyparsing import * 

foo = Literal('foo') 
bar = Literal('bar') 

Затем указать "любой заказ и любое число между скобками"

openBrace = Suppress(Literal("{")) 
closeBrace = Suppress(Literal("}")) 

foo_or_bar = foo | bar 
content = ZeroOrMore(foo_or_bar) 
exp = openBrace + content + closeBrace 

Теперь мы можем проверить:

In [40]: exp.parseString('{foo}') 
Out[40]: (['foo'], {}) 

In [41]: exp.parseString('{foobarfoo}') 
Out[41]: (['foo', 'bar', 'foo'], {}) 
+1

Я изменил Я попытался msgBody = openBrace + pp.ZeroOrMore (msgExpr | fieldExpr) + closeBrace, но это все еще не работает. Должно быть что-то еще мне не хватает. Я включил больше кода, потому что думал, что это может быть не проблема. – XYZ

+0

@XYZ - вам нужно быть более конкретным в отношении этого выражения, которое «не работает». – PaulMcG

+0

Ничего. У меня другая проблема, чем я думал. Спасибо – XYZ