2016-04-28 6 views
0

У меня есть куча файлов в папке. Предположим, я конвертирую все в текстовые файлы.python - сложный логический поиск слов в файлах

Я хочу использовать Python для выполнения поиска, как это:

query = '(word1 and word2) or (word3 and not word4)' 

фактическая logc меняется, и несколько слов могут быть использованы вместе. Другой пример:

query = '(shiny and glass and "blue car")' 

Также слова предоставлены пользователями, поэтому они являются переменными.

Я хочу показать предложения, которые соответствуют и имена файлов. Это действительно не требует сложной поисковой системы, такой как whoosh или haystack, которые должны индексировать файлы с полями. Кроме того, эти инструменты, похоже, не имеют логического запроса, как я объяснил выше. Я столкнулся с библиотекой pdfquery, которая делает именно то, что я хочу для PDF-файлов, но теперь мне это нужно для текстовых файлов и xml-файлов.

Любые предложения?

+0

- это вопрос, который, как известно, безопасен? 'eval' предоставит вам простоту, но если это пользовательский ввод, это чрезвычайно опасно. –

+0

. Этот запрос должен интерпретироваться с помощью семантики, подобной поисковой системе старой школы, где слово« слово »подразумевает« слово »в документ"? – user2357112

+0

Пользователь вводит слова и семантику (AND, OR, NOT, круглые скобки). – max

ответ

0

мне действительно нужно иметь такое решение, поэтому я сделал пакет питона под названием toned

Я надеюсь, что это будет полезно для других.

1

Нет простого способа сказать это, но это непросто. Вы пытаетесь перевести небезопасные строки в исполняемый код, так что вы не можете взять простой выход и использовать eval. Это не литералы, поэтому вы не можете использовать ast.literal_eval. Вам нужно написать лексер, который распознает такие вещи, как AND, NOT, OR, ( и ) и рассматривает их как нечто, отличное от строк. Наверху вам, по-видимому, нужно обрабатывать сложные булевы, поэтому это становится довольно сложным, чем вы думаете.

Ваш вопрос задает вопрос о поиске по предложении, что не работает с Python. Вам нужно будет написать еще один lexer, чтобы получить данные по предложению, а не по строке. Вам нужно будет прочитать текст в модуле io, чтобы сделать это эффективно. Я не знаю, как это сделать, но по существу вы будете зацикливаться, пока есть данные для цикла, чтения буферизации каждой итерации и получения, когда вы достигнете "\.(?=\s+)"

Тогда вам придется запускайте свои первые результаты lexer запроса с помощью набора списков, каждый из которых работает по результатам файла lexer.

+0

И после всего этого вы захотите, чтобы вы просто использовали 'awk' –

+0

У Awk также нет семантики предложения. –

+0

@AdamSmith Что делать, если я изменяю спецификации для поиска по строке, а не по предложению?Есть ли решение для этого случая? – max

Смежные вопросы