'|'运算符创建一个 MatchFirst 表达式,在其中评估替代项,直到出现第一个匹配项。
Pyparsing 纯粹从左到右工作,尽可能将解析器表达式应用于输入字符串。 pyparsing 所做的唯一前瞻是您写入解析器的任何内容。
在这个表达式中:
a = Group( n | Group( n + OneOrMore( Suppress(",") + n )))
比方说n
只是一个字面的“X”。如果这个解析器被给予输入字符串“X”,它显然会匹配前导的、单独的字符串。n
表达。如果给定字符串“X,X,X”,它仍然只匹配前导n
,因为这是解析器中的第一个选择。
如果将表达式翻转为:
a = Group( Group( n + OneOrMore( Suppress(",") + n )) | n)
然后要解析“X”,它首先尝试匹配列表,这将失败,然后匹配单独的n
。要解析“X,X,X”,第一个替代方案将是列表表达式,它将匹配。
如果您想要匹配最长的替代项,请使用“^”运算符,它给出 Or 表达式。或者将评估所有给定的替代方案,然后选择最长的匹配。
a = Group( n ^ Group( n + OneOrMore( Suppress(",") + n )))
您还可以使用 pyparsing 辅助方法来简化此操作delimitedList
。解析由逗号分隔的相同表达式的列表是一种常见的情况,因此人们不得不重新发明而不是看到expr + ZeroOrMore(Suppress(",") + expr)
一遍又一遍,我补充道delimitedList
作为标准的 pyparsing 助手。delimitedList("X")
将匹配“X”和“X,X,X”。