Pyparsing: различия между MatchFirst, Or и oneOf
В Pyparsing, какие различия между MatchFirst, Or и oneOf
когда в строках есть общие символы, такие как
слово, формулировка, слова
Или (['слово', 'формулировка', 'слова'])
MatchFirst (['word', 'wording', 'words'])
oneOf (['слово', 'формулировка', 'слова'])
2 ответа
Из онлайн-документов ( https://pythonhosted.org/pyparsing/)
MatchFirst
- Если два выражения совпадают, первое из перечисленных будет тем, которое будет соответствовать.Or
- Если два выражения совпадают, будет использовано выражение, соответствующее самой длинной строке.oneOf
- Помогает быстро определить набор альтернативных литералов и гарантирует, что тестирование будет длиться дольше всего, когда есть конфликт, независимо от порядка ввода, но возвращает MatchFirst для лучшей производительности.
MatchFirst
проверяет текущее местоположение синтаксического анализа с каждой строкой в ее конструкторе, останавливаясь на первой, чтобы соответствовать.
Or
проверяет текущее местоположение синтаксического анализа по всем строкам, указанным в его конструкторе, и возвращает самое длинное совпадение.
oneOf
генерирует Regex
или же MatchFirst
чтобы соответствовать самому длинному совпадению, переупорядочив список ввода, когда есть альтернативы с общими начальными строками, чтобы сначала проверить более длинную строку.
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"]