在Pyparsing中,MatchFirst,Or和oneOf
之间有什么区别当字符串中有共享字符时
单词,措辞,单词或(['word','wording','words'])
MatchFirst(['word','wording','words'])
oneOf(['word','wording','words'])
答案 0 :(得分:5)
来自在线文档(https://pythonhosted.org/pyparsing/)
MatchFirst
- 如果两个表达式匹配,则列出的第一个表达式将匹配。
Or
- 如果两个表达式匹配,将使用与最长字符串匹配的表达式。
oneOf
- 帮助快速定义一组备用文字,并确保在出现冲突时进行最长优先测试,无论输入顺序如何,但返回MatchFirst以获得最佳性能
MatchFirst
使用构造函数中的每个字符串测试当前的解析位置,在第一个字符串处停止匹配。
Or
针对其构造函数中给出的所有字符串测试当前的解析位置,并返回最长匹配。
oneOf
生成Regex
或MatchFirst
以匹配最长匹配,通过重新排序输入列表,当存在具有公共起始字符串的备选方案时,首先测试较长的字符串。
答案 1 :(得分:0)
oneOf
对str
进行操作,理解为空格分隔字符串,可以简单地定义为
oneOf = lambda xs: Or(Literal(x) for x in xs.split(" "))
虽然Or
对表达式 - ParseElement
个实例进行操作。
因此,您可以将oneOf
视为Or
的特化,或Or
是oneOf
的概括。
您可以将oneOf('foo bar')
写为Literal('foo') ^ Literal('bar')
但是你不能用Or
写每个oneOf
表达式。
MatchFirst
与Or
相同,但冲突解决方法 - Or
产生最长匹配,而MatchFirst
按定义顺序返回第一个匹配。
所以
expr = Literal('bar') ^ Words(alphanums)
expr.parseString("barstool").asList() == ["barstool"]
但
expr = Literal('bar') | Words(alphanums)
expr.parseString("barstool").asList() == ["bar"]