在Pyparsing中,MatchFirst、Or和oneOf有什么不同
当字符串中有共享字符时,如
单词,措辞,单词
Or('word','wording','words')
MatchFirst('word','wording','words')
oneOf('word','wording','words')
发布于 2014-06-23 12:18:43
从联机文档(https://pythonhosted.org/pyparsing/)
MatchFirst -如果两个表达式匹配,则列出的第一个表达式将是最长的那个-如果两个表达式匹配,则匹配最长字符串的表达式将是match.Or - used.oneOf,以快速定义一组可选文字,并确保在存在冲突时执行最长优先测试,而不考虑输入顺序,但返回最佳performance.的MatchFirst
MatchFirst使用其构造函数中的每个字符串测试当前解析位置,并在第一个匹配的字符串处停止。
Or根据其构造函数中给定的所有字符串测试当前解析位置,并返回最长的匹配项。
oneOf生成一个Regex或MatchFirst来匹配最长的匹配项,方法是在存在具有共同起始字符串的备选方案时对输入列表进行重新排序,以首先测试较长的字符串。
发布于 2017-03-06 21:31:22
oneOf对被理解为空格分隔字符串的str进行操作,可以简单地定义为
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表达式。
除了冲突解决方法之外,MatchFirst与Or相同- Or产生最长的匹配,而MatchFirst按定义顺序返回第一个匹配。
所以
expr = Literal('bar') ^ Words(alphanums)
expr.parseString("barstool").asList() == ["barstool"] 但
expr = Literal('bar') | Words(alphanums)
expr.parseString("barstool").asList() == ["bar"]https://stackoverflow.com/questions/24358037
复制相似问题