Как искать строку в Python, удаляя разрывы строк, но возвращая точную строку, где была найдена строка? - PullRequest
1 голос
/ 29 июля 2011

У меня есть куча файлов PDF, по которым мне нужно искать набор ключевых слов. Я должен извлечь точную строку, где ключевое слово было найдено. Сначала я использовал pdf2text из xpdf для преобразования файла в PDF. (Попробовал solr, но ему было нелегко адаптировать вывод / схему под мои требования).

import sys

file_name = sys.argv[1]
searched_string = sys.argv[2]
result = [(line_number+1, line) for line_number, line in enumerate(open(file_name)) if searched_string.lower() in line.lower()]

#print result

for each in result:
    print each[0], each[1]

ThinkCode: ~ $ python find_string.py sample.txt «Извлечение строки»

Проблема, с которой я столкнулся, заключается в том, что для случаев, когда строка поиска прерывается в конце строки:

Если вы собираетесь индексировать большие двоичные файлы, не забудьте изменить ограничения по размеру. Строка

Извлечение является распространенной проблемой

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

Очень ценю, ребята!

Ответы [ 3 ]

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

Примечание: некоторые соображения без какого-либо кода, но я думаю, что они относятся к ответу, а не к комментарию.

Моя идея состоит в том, чтобы искать только первое ключевое слово; если совпадение найдено, ищите второе. Это позволяет вам, если совпадение найдено в конце строки, учитывать следующую строку и выполнять конкатенацию строк, только если совпадение найдено на первом месте *.

Edit:

Кодировал простой пример и в итоге использовал другой алгоритм; основная идея заключается в следующем фрагменте кода:

def iterwords(fh):
    for number, line in enumerate(fh):
        for word in re.split(r'\s+', line.strip()):
            yield number, word

Он перебирает обработчик файла и создает кортеж (номер строки, слово) для каждого слова в файле.

Сопоставление впоследствии становится довольно простым; Вы можете найти мою реализацию в виде github . Его можно запустить следующим образом:

python search.py 'multi word search string' file.txt

Существует одна главная проблема со связанным кодом, я не кодировал обходной путь ни по причинам производительности, ни по сложности. Вы можете понять это? (Спойлер: попробуйте найти предложение, первое слово которого встречается в файле два раза подряд)

* Я не проводил никакого тестирования самостоятельно, но эта статья и python wiki предполагают, что объединение строк не так эффективно в python (не знаю как актуальная информация есть).

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

Возможно, есть лучший способ сделать это, но я бы предложил начать с двух строк (назовем их line1 и line2), конкатенировать их в line3 или что-то подобное, а затемищите эту результирующую строку.

Затем вы назначите line2 на line1, получите новый line2 и повторите процесс.

0 голосов
/ 29 июля 2011

Используйте флаг re.MULTILINE при компиляции выражений: http://docs.python.org/library/re.html#re.MULTILINE

Затем используйте \s для представления всего пробела (включая новые строки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...