使用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
产生这个输出:
^{pr2}$注意,我只在解析msgName表达式时才添加到msgNameList。(它的最终表达式和解析函数将更加复杂。)
对于两个测试字符串,我想要的输出是:
['msgNameA', 'msgNameAB']
我确信我的msgBody解析表达式是不正确的,但是我不能想出如何在pyparsing中表达我需要的内容。在大括号内,msgExpr或fieldExpr可以以任何顺序和任何数字出现(msgExpr。。。字段表达式。。。或fieldExpr。。。msgExpr。一些例子:
我知道一定有办法,但我错过了。在
提前谢谢
(首先,以后请准备一个MCVE问题。你问题的要点是
因此,请准备一个问题,仅包含足够的细节。)
假设我们从
然后指定“括号内的任何顺序和任何数字”
^{pr2}$现在我们可以检查:
相关问题 更多 >
编程相关推荐