2

我如何从一组令牌中获得零个或每个令牌中的一个?它们可以按任何顺序排列。说这是我的代码:

def parseFunc(self, string):
    firstToken = CaselessKeyword("KeyWordOne")
    secondToken = CaselessKeyword("KeyWordTwo")
    thirdToken = CaselessKeyword("KeyWordThree")

    stmt = ZeroOrMore(firstToken | secondToken | thirdToken)
    return stmt.parseString(string)

ZeroOrMore 存在一个问题,因为每个标记都可以显示多次。使用 Optional 时,它们必须按列出的确切顺序排列。

这是我目前的解决方案:

stmt = ZeroOrMore(firstToken | secondToken | thirdToken)
tokens = stmt.parseString(string)
s = set()
for x in tokens:
    if x[0] in s: return "Error: redundant options"
    s.add(x[0])

return tokens
4

1 回答 1

4

Optional与“零或一”相同:

stmt = Optional(firstToken | secondToken | thirdToken)

还有一种新的乘法形式,类似于{min,max}正则表达式:

stmt = (firstToken | secondToken | thirdToken) * (0,1)

编辑:

对于任意顺序,使用 Each(使用运算符 & 定义):

stmt = (Optional(firstToken) & Optional(secondToken) & Optional(thirdToken))
于 2013-06-13T15:57:24.337 回答