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"]
Другие вопросы по тегам