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, который вам нужен, будет Word("Infobox")ЛитералилиКлючевое слово.Отступая назад, похоже, что ваши группы данных состоят из
пар ключ=значениес разделителями ‘|’.
