首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PyParsing lookaheads和贪婪表达式

PyParsing lookaheads和贪婪表达式
EN

Stack Overflow用户
提问于 2012-02-12 01:57:11
回答 1查看 2.8K关注 0票数 12

我正在使用PyParsing为一种查询语言编写解析器,并且我被lookaheads的一个问题卡住了(我相信是这样的)。查询中的一种子句类型旨在将字符串拆分为3个部分(fieldname、operator、value),使fieldname为一个单词,operator为一个或多个单词,value为单词、带引号的字符串或带括号的列表。

我的数据看起来像

代码语言:javascript
运行
复制
author is william
author is 'william shakespeare'
author is not shakespeare
author is in (william,'the bard',shakespeare)

我当前对这个子句的解析器是这样写的:

代码语言:javascript
运行
复制
fieldname = Word(alphas)

operator = OneOrMore(Word(alphas))

single_value = Word(alphas) ^ QuotedString(quoteChar="'")
list_value = Literal("(") + Group(delimitedList(single_value)) + Literal(")")
value = single_value ^ list_value

clause = fieldname + originalTextFor(operator) + value

显然,这是因为operator元素贪婪,如果可以的话,它会吞噬value,这就失败了。通过阅读其他类似的问题和文档,我已经知道我需要使用NotAnyFollowedBy来管理这个先期工作,但我还不能想出如何做到这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-12 11:58:59

这是一个做解析器的好地方。或者更准确地说,让解析器像你一样思考。问问自己,“在‘作者是莎士比亚’中,我怎么知道‘莎士比亚’不是运算符的一部分?”你知道‘莎士比亚’是值,因为它在查询的末尾,后面没有别的了。所以运算符字词不只是字母的单词,它们是字母的单词,后面没有字符串的结尾。现在,将先行逻辑构建到operator的定义中

代码语言:javascript
运行
复制
operator = OneOrMore(Word(alphas) + ~FollowedBy(StringEnd()))

我认为这将为您更好地开始解析。

其他一些建议:

  • 我只在可能有歧义的情况下使用'^‘运算符,比如我要解析一个字符串,其中的数字可以是整数,也可以是十六进制。如果我使用Word(nums) | Word(hexnums),那么我可能会把"123ABC“误认为是前导的"123”。通过将'|‘更改为'^',将测试所有备选方案,并选择最长的匹配。在我解析十进制或十六进制整数的示例中,我可以通过颠倒备选方案得到相同的结果,并首先测试Word(hexnums)。在查询语言中,没有办法将带引号的字符串与不带引号的单个字值混淆(一个以'"开头,另一个则不是),因此没有理由使用'^','|‘就足够了。将for value = singleValue ^ listValue.
  • Adding results名称类似于查询字符串的关键部分将使以后更容易使用:

clause = fieldname("fieldname") + originalTextFor(operator)("operator") + value("value")

现在,您可以通过名称而不是通过解析位置来访问已解析的值(一旦您开始使用可选字段等变得更加复杂,这将变得棘手且容易出错):

queryParts = clause.parseString('author is william')

print queryParts.fieldname

print queryParts.operator

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

https://stackoverflow.com/questions/9242561

复制
相关文章

相似问题

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