2013-06-13 34 views
2

如何從一組令牌中獲得零個或僅一個令牌?他們可以以任何順序。說這是我的代碼:Pyparsing - 組中的零個或一個

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

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

隨着零或有一個問題,因爲每個令牌可以顯示多次。 隨着可選,他們必須按照他們列出的確切順序。

這是我目前的解決方案:

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

Optional是一樣的 「零或一」:

stmt = Optional(firstToken | secondToken | thirdToken) 

還有一個新的乘法形式,正則表達式類似於{min,max}

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

編輯:

對於任意的順序,使用每個(使用運營商定義的&):

stmt = (Optional(firstToken) & Optional(secondToken) & Optional(thirdToken)) 
+0

謝謝你的回答,但可選的令牌必須在正確的順序。我需要的是這些令牌以任意順序的可能性。我找到了一些不同的解決方案,並將其添加到我的問題中。 – Xitac

+0

您提供的文件與準確的順序無關,它只接受*一個選項。看我的編輯。 – PaulMcG

+0

這對我不起作用。這可能是由於pyparsing(1.5.7)的舊版本?我的陳述使用的ZeroOrMore確實提供了任意的順序,但它也允許多個相同的標記。這就是爲什麼我從分析中獲得令牌之後添加了set檢查,這解決了我的問題。 – Xitac

相關問題