Проблема
Предостережение: я хорошо разбираюсь в регулярных выражениях, но я новичок в Python. Я пытался читать как можно шире и не смог найти решения, соответствующего моему сценарию, поэтому я задаю этот вопрос.
Я хочу выполнить следующее:
- Loopчерез все текстовые файлы в папке (я мог бы использовать файлы .docx / xml в какой-то момент, но я выясню детали). Я подозреваю, что это вопрос итерации, но я не понимаю, как это сделать здесь;
- Поиск регулярных выражений ИЛИ список регулярных выражений, содержащихся в файле (как в gazetteer), в идеале хранящемся ввнешний файл .txt или .csv;
- Напечатайте (или, что еще лучше, запишите в 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 модуля.