отказоустойчивый парсер на основе Python для кабелей WikiLeaks - PullRequest
5 голосов
/ 15 мая 2011

Некоторое время назад я начал писать грамматику на основе BNF для кабелей, которую WikiLeaks выпустил . Однако теперь я понял, что мой подход, возможно, не самый лучший, и я ожидаю некоторого улучшения.

Кабина состоит из трех частей. Голова имеет стиль RFC2822 . Этот анализ обычно правильный. Текстовая часть имеет более неформальную спецификацию. Например, есть REF -линия. Это должно начинаться с REF:, но я нашел разные версии. Следующее регулярное выражение перехватывает большинство случаев: ^\s*[Rr][Ee][Ff][Ss: ]. Так что впереди есть места, разные дела и так далее. Текстовая часть в основном представляет собой простой текст с некоторыми специальными форматированными заголовками.

Мы хотим распознать каждое поле (дата, REF и т. Д.) И поместить в базу данных. Мы выбрали Pythons SimpleParse. В данный момент анализ останавливается на каждом поле, которое он не распознает. Сейчас мы ищем более отказоустойчивое решение. Все поля имеют какой-то порядок. Когда синтаксический анализатор не распознает поле, он должен добавить некоторый «не распознанный» блоб к текущему полю и продолжить. (Или, может быть, у вас есть лучший подход).

Какой парсер или другое решение вы бы предложили? Что-то лучше вокруг?

Ответы [ 2 ]

4 голосов
/ 20 июля 2011

Кабельная карта, кажется, делает то, что вы ищете: http://pypi.python.org/pypi/cablemap.core/

1 голос
/ 05 июля 2011

Я не смотрел кабели, но давайте рассмотрим аналогичную проблему и рассмотрим варианты: допустим, вы хотели написать парсер для RFC, есть RFC для форматирования RFC, но не все RFC следуют этому.

Если вы написали строгий анализатор, вы столкнетесь с ситуацией, с которой столкнулись - выбросы остановят ваш прогресс - в этом случае у вас есть два варианта:

  1. Разделите их на две группы: строго отформатированные и нет.Напишите свой строгий синтаксический анализатор так, чтобы он получал низко висящие фрукты, и на основе числовых выбросов определите, какие из них лучше всего подходят (ручная обработка, анализатор выбросов и т. Д.)одинакового размера, или есть больше выбросов, чем стандартные форматы - напишите гибкий анализатор.В этом случае регулярные выражения будут более полезны для вас, так как вы можете обработать весь файл в поисках ряда гибких регулярных выражений. Если одно из регулярных выражений завершится неудачно, вы можете легко сгенерировать список выбросов.Но, поскольку вы можете выполнять поиск по ряду регулярных выражений, вы можете построить матрицу неудачных / неудачных попыток для каждого регулярного выражения.

Для «нечетких» данных, где некоторые следуют формату, а некоторыенет, я предпочитаю использовать подход регулярных выражений.Это только я, хотя.(Да, это медленнее, но при проектировании взаимосвязей между каждым сегментом сопоставления, чтобы у вас был один запрос (или анализатор), который подходит для каждого углового случая, это кошмар, когда речь идет о вводимых человеком данных.

...