Pyparsing:MatchFirst,Or和oneOf之间的差异

时间:2014-06-23 03:28:51

标签: pyparsing

在Pyparsing中,MatchFirst,Or和oneOf

之间有什么区别

当字符串中有共享字符时

单词,措辞,单词

或(['word','wording','words'])

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

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

2 个答案:

答案 0 :(得分:5)

来自在线文档(https://pythonhosted.org/pyparsing/

  • MatchFirst - 如果两个表达式匹配,则列出的第一个表达式将匹配。

  • Or - 如果两个表达式匹配,将使用与最长字符串匹配的表达式。

  • oneOf - 帮助快速定义一组备用文字,并确保在出现冲突时进行最长优先测试,无论输入顺序如何,但返回MatchFirst以获得最佳性能

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

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

oneOf生成RegexMatchFirst以匹配最长匹配,通过重新排序输入列表,当存在具有公共起始字符串的备选方案时,首先测试较长的字符串。

答案 1 :(得分:0)

oneOfstr进行操作,理解为空格分隔字符串,可以简单地定义为

oneOf = lambda xs: Or(Literal(x) for x in xs.split(" "))

虽然Or对表达式 - ParseElement个实例进行操作。 因此,您可以将oneOf视为Or的特化,或OroneOf的概括。

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

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

所以

expr = Literal('bar') ^ Words(alphanums)
expr.parseString("barstool").asList() == ["barstool"]    

expr = Literal('bar') | Words(alphanums)
expr.parseString("barstool").asList() == ["bar"]