2

トークンのグループから各トークンをゼロまたは 1 つだけ取得するにはどうすればよいですか? それらは任意の順序にすることができます。これが私のコードだとしましょう:

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「0または1」と同じです。

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 に答える