Правило Токенизации Приоритет Pyparsing


Ниже мой игрушечный парсер:

from pyparsing import Word,OneOrMore,alphanums,nums

number=Word(nums)
word=OneOrMore(Word(alphanums))
greeting = word+(number)

tests = "Hello3 World 1234"
print tests, "->", greeting.parseString(tests)

Результаты, которые я ожидал получить, были

['Hello3','World','1234']

Но вместо этого я получаю ошибку:

ParseException: Expected W:(0123...) (at char 17), (line:1, col:18)

Разве строка '1234' не должна сначала совпадать с правилом 'числа', а затем игнорироваться правилом 'слова'?

Я подозреваю, что это поздно ночью, и я пропустил что-то совершенно элементарное в документации, но я просмотрел "начало работы с pyparsing" o'Reilly pdf дважды и не могу найти решение. Спасибо за любую помощь.

1 2

1 ответ:

Это сопоставление вашего "1234" с правилом word, поскольку вы сказали, что оно может быть буквенным или числовым. Правила word продолжают захватывать термины, включая "1234", и поэтому ошибка заключается в том, что Правило number никогда не попадает.

Если ваше правило для word ближе к определению идентификатора python (не может начинаться с цифры), это исправит ваш синтаксический анализатор:

from pyparsing import Word, OneOrMore, alphas, alphanums, nums

number=Word(nums)
word=OneOrMore(Word(initChars=alphas, bodyChars=alphanums))
greeting = word+(number)

tests = "Hello3 World 1234"
print tests, "->", greeting.parseString(tests)