Слово дает звуко буквенный разбор: Фонетический разбор слова и звуко-буквеннный анализ

python — ast.literal_eval: SyntaxError: неожиданный EOF при разборе

спросил

Изменено 10 лет, 1 месяц назад

Просмотрено 15 тысяч раз

При попытке проанализировать пустую строку я получаю SyntaxError . Почему это вызывает другую ошибку, чем разбор 'фу' ? В исходнике ast.literal_eval явно возникает только ValueError .

 В [1]: импорт аст
В [2]: ast.literal_eval('foo')
-------------------------------------------------- -------------------------
ValueError Traceback (последний последний вызов)
 в ()
----> 1 ast.literal_eval('foo')
/usr/lib/python2.7/ast.pyc в literal_eval(node_or_string)
     78 возврат влево-вправо
     79SyntaxError: неожиданный EOF при синтаксическом анализе
 
  • питон

3

ast использует compile для компиляции исходной строки (которая должна быть выражением) в AST.

Если исходная строка не является допустимым выражением (например, пустой строкой), SyntaxError будет вызвана компиляцией . Если, с другой стороны, исходная строка будет допустимым выражением (например, имя переменной вроде foo ), compile завершится успешно, но тогда literal_eval может завершиться ошибкой с ValueError .

Следовательно, вы должны поймать как SyntaxError , так и ValueError при использовании literal_eval .

2

Зарегистрируйтесь или войдите

Зарегистрироваться через Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

python — Синтаксический анализ группы смешанных символов

Всего пара вещей. Что наиболее важно, pyparsing не выполняет такой же возврат, как регулярное выражение. То есть что-то вроде этого не сработает:

 data = '{' + OneOrMore(Word(printables))("data") + '}'
print(data.parseString('{это некоторые данные}'))
 

Почему? Поскольку завершающий ‘}’ также соответствует Word(printables) , поэтому OneOrMore просто продолжит работу до конца, а затем завершится ошибкой, поскольку после чтения данных не будет найдено завершающего ‘}’.

До недавнего времени решение состояло в том, чтобы включить защиту в выражение OneOrMore , что означало отрицательную формулировку: «Я хочу Word(печатные формы), но сначала проверьте, не является ли это ‘}’ — я этого не хочу. «, и это выглядит так:

 data = '{' + OneOrMore(~Literal('}') + Word(printables))("data") + '}'
 

Но это было настолько распространено, что я недавно добавил необязательный аргумент stopOn к ZeroOrMore и OneOrMore :

 data = '{' + OneOrMore(Word(printables), stopOn=Literal('}'))("data") + '}'
 

В вашем случае, когда каждая группа данных анализирует пару ключ=значение , ваше значение было в порядке, когда вы только анализировали OneOrMore(Word(alphanums)) . Но как только вы изменили его на OneOrMore(Word(alphanums+printables)) , ваш повторяющийся термин будет жадно соответствовать следующему ‘|’ или завершающий ‘}}’ и завершится ошибкой, как в приведенном выше примере.

Несколько других предметов:

  • pyparsing пропустит для вас пробелы. Все эти элементы White() совершенно не нужны.

  • В нескольких местах вы неправильно используете Word, например, Word("Infobox") . В вашем ограниченном примере это соответствует нормально, но помните, что Word определяется набором символов, которые вы хотите сопоставить как группу слов, поэтому

    Word("Infobox") будет соответствовать не только «Infobox», но и любое другое слово, состоящее из букв «I», «n», «f», «o», «b» и/или «x», например «Inbox», «IbIx», «xoxoxox» и т. д. , В этом случае класс pyparsing, который вам нужен, будет Литерал или Ключевое слово .

  • Отступая назад, похоже, что ваши группы данных состоят из пар ключ=значение с разделителями ‘|’.

admin

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *