Найти регулярное выражение или список регулярных выражений в нескольких текстовых файлах и извлечь соответствующие строки - PullRequest
0 голосов
/ 09 ноября 2019

Проблема

Предостережение: я хорошо разбираюсь в регулярных выражениях, но я новичок в Python. Я пытался читать как можно шире и не смог найти решения, соответствующего моему сценарию, поэтому я задаю этот вопрос.

Я хочу выполнить следующее:

  1. Loopчерез все текстовые файлы в папке (я мог бы использовать файлы .docx / xml в какой-то момент, но я выясню детали). Я подозреваю, что это вопрос итерации, но я не понимаю, как это сделать здесь;
  2. Поиск регулярных выражений ИЛИ список регулярных выражений, содержащихся в файле (как в gazetteer), в идеале хранящемся ввнешний файл .txt или .csv;
  3. Напечатайте (или, что еще лучше, запишите в CSV или Pandas) имя файла, найденное совпадение и строку текста, содержащую последний. В идеале они должны располагаться в разных столбцах электронной таблицы, поэтому они могут быть значениями, разделенными запятыми, но словарь будет работать так же хорошо.

У меня был некоторый успех с кодом такого рода, который позволил мне успешно печатать совпадающие строки. Всего около шести часов опыта работы с Python я чувствовал себя довольно счастливым.

import re

def main():
        regex = re.compile("regex")
        with open("text_file.txt") as f:
            for line in f:
                result = regex.findall(line)
                if result == None:
                    continue
                elif result == []:
                    continue
                else:
                    print(f, result, line)

main()

Проблемы и цели:

  • Возвращает все группы захвата для регулярного выражения (у меня есть несколькозахватывать группы) перед соответствующей строкой. Это не проблема, но я хотел бы иметь возможность манипулировать этим каким-либо образом в будущем;
  • Я хотел бы иметь возможность повторно использовать объекты (имя файла, совпадение, строка) для дальнейшей манипуляции ианализ, в идеале импортировать все это в объект панды, но я понятия не имею, как это сделать. Любое предложение будет оценено по достоинству:
  • Когда регулярное выражение сопоставляет несколько шаблонов в одной строке, оно возвращает только одну строку, содержащую совпадения. Однако я бы хотел, чтобы один такой случай обрабатывался по-другому. В частности, я хотел бы, чтобы он возвращал столько строк, сколько есть совпадений. Рассмотрим пример строки:
We used to call Bob "Little Bobby"

Мое регулярное выражение "Bob (by)?"будет соответствовать "Боб" и "Бобби". Но мой код напечатает что-то вроде этого (если я не ошибаюсь).

<_io.TextIOWrapper name='text_file.txt' mode='r' encoding='UTF-8'> [('Bob', ''), ('Bobby', ('by')) We used to call Bob "Little Bobby"

Вместо этого я хочу, чтобы он напечатал две строки (одну для матча "Боб" и одну для матча "Бобби"Это можно сделать относительно легко в grep, если я правильно помню, но я не могу найти ничего полезного в документации re модуля.

1 Ответ

1 голос
/ 09 ноября 2019
  1. Перебрать все текстовые файлы в папке (в какой-то момент я мог бы использовать файлы .docx / xml, но я выясню детали). Я подозреваю, что это вопрос итерации, но я не понимаю, как это сделать здесь;

Да, вам нужно выполнить итерацию. Я рекомендую использовать os.listdir или glob.glob в зависимости от ваших потребностей.

Пример:

import glob
for filename in glob.glob('/path/to/my/dir', '*.txt'):
    print(filename)
    # do other stuff with filename
Поиск регулярных выражений ИЛИ список регулярных выражений, содержащихся в файле (как в gazetteer), в идеале хранящийся во внешнем файле .txt или .csv;

Я рекомендуюиспользование re.findall или re.finditer.

Пример:

import re

my_re = re.compile('whatever your regex is')
with open(filename) as f:
    file_contents = f.read()
    for match in my_re.findall(file_contents):
        print(match)
        # do whatever you want with the match here

Чтобы извлечь группы из совпадения, необходимо использовать.groups функция.

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

Вы можете загрузить все данные вPython list из dict с и затем использовать библиотеку csv для вывода ее в CSV.

Пример:

import csv

list_of_data = [{ ... }, { ... }]

with open(output_filename, 'w+') as f:
    # this specifies what the headers of your CSV will be.
    # you can also just specify a list of strings here
    fieldnames = list_of_data[0].keys()
    writer = csv.DictWriter(f, fieldnames=fieldnames)

    writer.writeheader()
    for item in list_of_data:
        writer.writerow(item)
...