Использование python (acora) для поиска строк, содержащих ключевые слова

Я пишу программу, которая читает в каталоге текстовых файлов и находит определенную комбинацию строк, которые перекрываются (то есть совместно используются всеми файлами). Мой текущий подход заключается в том, чтобы взять один файл из этого каталога, проанализировать его, создать список каждой строковой комбинации, а затем выполнить поиск этой строковой комбинации в других файлах. Например, если бы у меня было десять файлов, я бы прочитал один файл, проанализировал его, сохранил ключевые слова, которые мне нужны, а затем поискал в других девяти файлах эту комбинацию. Я бы повторил это для каждого файла (убедившись, что отдельный файл не ищет сам себя). Для этого я пытаюсь использовать модуль acora в python.

Код, который я до сих пор:

def match_lines(f, *keywords):
    """Taken from [https://pypi.python.org/pypi/acora/], FAQs and Recipes #3."""
    builder = AcoraBuilder('\r', '\n', *keywords)
    ac = builder.build()

    line_start = 0
    matches = False
    for kw, pos in ac.filefind(f):  # Modified from original function; search a file, not a string.
        if kw in '\r\n':
            if matches:
                yield f[line_start:pos]
                matches = False
            line_start = pos + 1
        else:
            matches = True
    if matches:
        yield f[line_start:]


def find_overlaps(f_in, fl_in, f_out):
    """f_in: input file to extract string combo from & use to search other files.
    fl_in: list of other files to search against.
    f_out: output file that'll have all lines and file names that contain the matching string combo from f_in.
    """
    string_list = build_list(f_in)  # Open the first file, read each line & build a list of tuples (string #1, string #2). The "build_list" function isn't shown in my pasted code.
    found_lines = []  # Create a list to hold all the lines (and file names, from fl_in) that are found to have the matching (string #1, string #2).
    for keywords in string_list:  # For each tuple (string #1, string #2) in the list of tuples
        for f in fl_in:  # For each file in the input file list
            for line in match_lines(f, *keywords):
                found_lines.append(line)

Как вы, вероятно, можете сказать, я использовал функцию match_lines с веб-страницы acora, "FAQ и рецепты" #3. Я также использовал его в режиме для разбора файлов (используя ac.filefind()), также находится на веб-странице.

Код, кажется, работает, но он только дает мне имя файла с соответствующей комбинацией строк. Мой желаемый вывод - выписать всю строку из других файлов, которые содержат мою подходящую комбинацию строк (кортеж).

1 ответ

Решение

Я не вижу, что здесь будет производить имена файлов, как вы говорите, это делает.

Независимо от того, чтобы получить номера строк, вам просто нужно посчитать их, когда вы передаете их в match_lines():

line_start = 0
line_number = 0
matches = False
text = open(f, 'r').read()
for kw, pos in ac.filefind(f):  # Modified from original function; search a file, not a string.
    if kw in '\r\n':
        if matches:
            yield line_number, text[line_start:pos]
            matches = False
        line_start = pos + 1
        line_number += 1
    else:
        matches = True
if matches:
    line_number, yield text[line_start:]
Другие вопросы по тегам