首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pyparsing不会解析整个字符串

pyparsing不会解析整个字符串
EN

Stack Overflow用户
提问于 2017-02-11 04:19:11
回答 2查看 461关注 0票数 4

我有以下语法和测试用例:

代码语言:javascript
复制
from pyparsing import Word, nums, Forward, Suppress, OneOrMore, Group

#A grammar for a simple class of regular expressions
number = Word(nums)('number')
lparen = Suppress('(')
rparen = Suppress(')')

expression = Forward()('expression')

concatenation = Group(expression + expression)
concatenation.setResultsName('concatenation')

disjunction = Group(lparen + OneOrMore(expression + Suppress('|')) + expression + rparen)
disjunction.setResultsName('disjunction')

kleene = Group(lparen + expression + rparen + '*')
kleene.setResultsName('kleene')

expression << (number | disjunction | kleene | concatenation)

#Test a simple input
tests = """
(8)*((3|2)|2)
""".splitlines()[1:]

for t in tests:
    print t
    print expression.parseString(t)
    print

结果应该是

代码语言:javascript
复制
[['8', '*'],[['3', '2'], '2']]

但是相反,我只能得到

代码语言:javascript
复制
[['8', '*']]

如何让pyparsing解析整个字符串?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-11 21:03:39

您的concatenation表达式并没有做您想要的事情,而且几乎是左递归的(幸运的是,它是表达式中的最后一项)。如果你这样做,你的语法是有效的:

代码语言:javascript
复制
expression << OneOrMore(number | disjunction | kleene)

通过这个更改,我得到了以下结果:

代码语言:javascript
复制
[['8', '*'], [['3', '2'], '2']]

编辑:如果改用|运算符,还可以避免<<优先于<<=

代码语言:javascript
复制
expression <<= OneOrMore(number | disjunction | kleene)
票数 3
EN

Stack Overflow用户

发布于 2017-02-11 05:01:40

parseString有一个参数parseAll。如果您使用parseAll=True调用parseString,如果您的语法不能解析整个字符串,您将得到错误消息。从那里开始!

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42168000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档