4

何らかの理由で、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+、AKo-ATo、およびKQz(またはそれより深いレイヤー)の周りのリストを作成しないのかわかりません。私は何が欠けていますか?

4

1 に答える 1

8

あなたが指示しなかったので、Pyparsingはこれらのトークンをグループ化しません。Pyparsingのデフォルトの動作は、一致したすべてのトークンを1つのリストに単純につなぎ合わせることです。トークンのグループ化を取得するには、構文解析式でグループ化される式をパーサーでラップします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これは、区切り文字が重要なビットであるリスト要素の間の区切り文字として存在することを前提としています。

これらの2つの変更を行った後、解析結果は、要求しているもののようになり始めます。

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

これらの結果を構造化するために、定義をGroup回避することもできます。hand

これが何らかの方法で評価される式(ポーカーハンドなど)の場合は、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

If you construct objects for these expressions, then you won't need to use Group.

于 2010-11-20T06:51:34.073 に答える