首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Pyparsing: MatchFirst、Or和oneOf之间的区别

Pyparsing: MatchFirst、Or和oneOf之间的区别
EN

Stack Overflow用户
提问于 2014-06-23 11:28:51
回答 2查看 1.5K关注 0票数 4

在Pyparsing中,MatchFirst、Or和oneOf有什么不同

当字符串中有共享字符时,如

单词,措辞,单词

Or('word','wording','words')

MatchFirst('word','wording','words')

oneOf('word','wording','words')

EN

回答 2

Stack Overflow用户

发布于 2014-06-23 12:18:43

从联机文档(https://pythonhosted.org/pyparsing/)

  • MatchFirst -如果两个表达式匹配,则列出的第一个表达式将是最长的那个-如果两个表达式匹配,则匹配最长字符串的表达式将是match.
  • Or - used.
  • oneOf,以快速定义一组可选文字,并确保在存在冲突时执行最长优先测试,而不考虑输入顺序,但返回最佳performance.

的MatchFirst

MatchFirst使用其构造函数中的每个字符串测试当前解析位置,并在第一个匹配的字符串处停止。

Or根据其构造函数中给定的所有字符串测试当前解析位置,并返回最长的匹配项。

oneOf生成一个RegexMatchFirst来匹配最长的匹配项,方法是在存在具有共同起始字符串的备选方案时对输入列表进行重新排序,以首先测试较长的字符串。

票数 6
EN

Stack Overflow用户

发布于 2017-03-06 21:31:22

oneOf对被理解为空格分隔字符串的str进行操作,可以简单地定义为

代码语言:javascript
运行
复制
oneOf = lambda xs: Or(Literal(x) for x in xs.split(" "))

Or在expressions ParseElement实例上运行。因此,您可以将oneOf看作是Or的特化,或者将Or看作是oneOf的泛化。

您可以将oneOf('foo bar')编写为Literal('foo') ^ Literal('bar'),但不能使用oneOf编写每个Or表达式。

除了冲突解决方法之外,MatchFirstOr相同- Or产生最长的匹配,而MatchFirst按定义顺序返回第一个匹配。

所以

代码语言:javascript
运行
复制
expr = Literal('bar') ^ Words(alphanums)
expr.parseString("barstool").asList() == ["barstool"]    

代码语言:javascript
运行
复制
expr = Literal('bar') | Words(alphanums)
expr.parseString("barstool").asList() == ["bar"]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24358037

复制
相关文章

相似问题

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