python – pyparsing不是嵌套列表…为什么?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – pyparsing不是嵌套列表…为什么?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1754字,纯文字阅读大概需要3分钟。
内容图文
![python – pyparsing不是嵌套列表…为什么?](/upload/InfoBanner/zyjiaocheng/807/a2a59cb1508341d78edd47ca33840a2e.jpg)
出于某种原因,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(或任何比这更深的层)创建列表.我错过了什么?
解决方法:
Pyparsing不会对这些令牌进行分组,因为您没有告诉它. Pyparsing的默认行为是将所有匹配的标记简单地串在一起.要对令牌进行分组,请将解析器中的表达式包装在一个pyparsing Group表达式中.在您的情况下,更改系列:
series = hand + Optional(greater | through + hand)
至
series = Group(hand + Optional(greater | through + hand))
另外,我建议您不要像在序列中那样实现自己的逗号分隔列表,而是使用pyparsing helper,delimitedList:
hand_range = delimitedList(series)
delimitedList采用逗号分隔符,但任何字符(甚至完整的pyparsing表达式)都可以作为delim参数给出.分隔符本身从结果中被抑制,因为delimitedList假定分隔符仅仅是重要位,列表元素之间的分隔符.
完成这两项更改后,解析结果现在开始看起来更像您要求的内容:
[['2', '2', '+'], ['A', 'K', 'o', '-', 'A', 'T', 'o'], ['K', 'Q', 'z']]
我猜你也可能想把Group围绕手定义,以构建那些结果.
如果这是一个将以某种方式进行评估的表达式(如扑克手),那么请查看pyparsing wiki上的这些示例,它们使用类作为解析操作来构造可以评估rank或boolean值的对象或者其他.
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.
内容总结
以上是互联网集市为您收集整理的python – pyparsing不是嵌套列表…为什么?全部内容,希望文章能够帮你解决python – pyparsing不是嵌套列表…为什么?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。