2010-11-20 8 views
4

ネストされていません。pyparsingはネストリストではありません...なぜですか?何らかの理由で、pyparsingは私の文字列のリストを

rank = oneOf("2 3 4 5 6 7 8 9 T J Q K A") 
suit = oneOf("h c d s") 
card = rank + Optional(suit) 

suit_filter = oneOf("z o") 
hand = card + card + Optional(suit_filter) 

greater = Literal("+") 
through = Literal("-") 
series = hand + Optional(greater | through + hand) 

series_split = Literal(",") 
hand_range = series + ZeroOrMore(series_split + series) 

hand_range.parseString('22+,AKo-ATo,KQz') 

>> ['2', '2', '+', ',', 'A', 'K', 'o', '-', 'A', 'T', 'o', ',', 'K', 'Q', 'z'] 

pyparsingは22+、赤穂ATO、およびKQz(または任意の周りのリストを作成していない理由を私はよく分かりません層はそれより深い)。私は何が欠けていますか?

答えて

8

これらのトークンは、あなたが指示していないため、分類がグループ化されていません。 Pyparsingのデフォルトの動作は、一致したすべてのトークンを単一のリストに単純にストリングすることです。あなたのトークンをグループ化するには、パーサの中の式を、除外式Groupの式でグループ化してラップします。あなたのケースでは、seriesから変更します。

series = hand + Optional(greater | through + hand) 

また

series = Group(hand + Optional(greater | through + hand)) 

に、私はあなたが seriesに行ったように、独自のカンマ区切りのリストを実装するが、代わりにpyparsingヘルパーを使用しないことをお勧めします、 delimitedList

hand_range = delimitedList(series) 

delimitedListは、カンマ区切り文字を想定しているが、任意の文字(あるいは完全pyparsing式) delim引数として与えることができます。 delimitedListは区切り文字が重要なビットであるリスト要素の間の区切り文字であると仮定しているため、区切り文字自体は結果から除外されます。に、私はあなたにもhand定義周りGroupを置きたいかもしれないと推測している

[['2', '2', '+'], ['A', 'K', 'o', '-', 'A', 'T', 'o'], ['K', 'Q', 'z']] 

これら2つの変更を行った後、解析結果が今より多くのあなたが求めているもののように見え始めますそれらの結果も同様に構造化する。

これは、(ポーカーハンドのような)何らかの方法で評価される式の場合、クラスを解析アクションとして使用してランクまたは評価の対象となるオブジェクトを構築するpyparsing wikiのこれらの例を見てください。ブール値など。

http://pyparsing.wikispaces.com/file/view/invRegex.py

http://pyparsing.wikispaces.com/file/view/simpleBool.py

http://pyparsing.wikispaces.com/file/view/eval_arith.py

あなたはこれらの表現のためのオブジェクトを作成する場合は、Groupを使用する必要はありません。

+0

良い答えですが、参考までに 'invRegex.py'リンクが無効です。 – shuttle87

関連する問題