我如何从一组令牌中获得零个或仅一个令牌?它们可以按任何顺序排列。说这是我的代码:
def parseFunc(self, string):
firstToken = CaselessKeyword("KeyWordOne")
secondToken = CaselessKeyword("KeyWordTwo")
thirdToken = CaselessKeyword("KeyWordThree")
stmt = ZeroOrMore(firstToken | secondToken | thirdToken)
return stmt.parseString(string)
Run Code Online (Sandbox Code Playgroud)
ZeroOrMore 存在一个问题,因为每个标记都可以显示多次。对于可选,它们必须严格按照列出的顺序排列。
这是我当前的解决方案:
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
Run Code Online (Sandbox Code Playgroud)
Optional与“零或一”相同:
stmt = Optional(firstToken | secondToken | thirdToken)
Run Code Online (Sandbox Code Playgroud)
还有一种新的乘法形式,类似于{min,max}正则表达式:
stmt = (firstToken | secondToken | thirdToken) * (0,1)
Run Code Online (Sandbox Code Playgroud)
编辑:
对于任意顺序,请使用 Each (使用运算符 & 定义):
stmt = (Optional(firstToken) & Optional(secondToken) & Optional(thirdToken))
Run Code Online (Sandbox Code Playgroud)