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 определяется набором символов, которые вы хотите сопоставить как группу слов, поэтому
будет соответствовать не только «Infobox», но и любое другое слово, состоящее из букв «I», «n», «f», «o», «b» и/или «x», например «Inbox», «IbIx», «xoxoxox» и т. д. , В этом случае класс pyparsing, который вам нужен, будетЛитерал
илиКлючевое слово
.Отступая назад, похоже, что ваши группы данных состоят из
пар ключ=значение
с разделителями ‘|’.