以任意顺序和麻木方式处理pyparsing表达式序列

2024-04-19 00:07:28 发布

您现在位置:Python中文网/ 问答频道 /正文

使用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。一些例子:

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

我知道一定有办法,但我错过了。在

提前谢谢


Tags: field表达式msgpyparsing大括号ppidentsuppress
1条回答
网友
1楼 · 发布于 2024-04-19 00:07:28

(首先,以后请准备一个MCVE问题。你问题的要点是

Using pyparsing, I need to specify that two expressions can occur in any order and in any number between two braces. Below is my code.

因此,请准备一个问题,仅包含足够的细节。)

假设我们从

from pyparsing import *

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

然后指定“括号内的任何顺序和任何数字”

^{pr2}$

现在我们可以检查:

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

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

相关问题 更多 >