Правило Токенизации Приоритет 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 ответ:
Это сопоставление вашего "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)