代码之家  ›  专栏  ›  技术社区  ›  MikeRand

pyparsing不是嵌套列表…为什么?

  •  4
  • MikeRand  · 技术社区  · 14 年前

    出于某种原因,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(或任何更深的层)左右的列表。我错过了什么?

    1 回复  |  直到 11 年前
        1
  •  8
  •   PaulMcG    14 年前

    Pyparsing没有对这些令牌进行分组,因为您没有告诉它。Pyparsing的默认行为是将所有匹配的令牌串在一个列表中。要获得令牌的分组,请将要分组到pyparsing中的表达式包装在解析器中 Group 表达。在你的情况下,改变 series 发件人:

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

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

    另外,我建议您不要像在中所做的那样实现自己的逗号分隔列表 系列 ,但使用pyparsing帮助程序, delimitedList :

    hand_range = delimitedList(series)
    

    分隔列表 假定使用逗号分隔符,但任何字符(甚至完整的pyparsing表达式)都可以作为 delim 争论。分隔符本身不显示在结果中,如 分隔列表 假设分隔符只是作为重要位列表元素之间的分隔符存在。

    在做了这两个更改之后,解析结果现在看起来更像您所要求的:

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

    我猜你可能还想 集团 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

    如果为这些表达式构造对象,则不需要使用 集团 .