Сопоставление регулярных выражений содержимого текстовых файлов в каталоге

#python #regex

Вопрос:

У меня есть каталог текстовых файлов. Мне нужно установить статус для каждого файла в зависимости от того, соответствует ли он 1, обоим или ни одному из шаблонов регулярных выражений. Мой план таков:

  1. Каталог прогулок
  2. Если содержимое файла:
    • не соответствует ни одному шаблону, статус = 1
    • соответствует шаблону 1, НО НЕ шаблону 2, статус = 2
    • соответствует шаблону 2, НО НЕ шаблону 1, игнорировать
    • соответствует шаблону1 И шаблону2, статус = 3
  3. Имя и статус файла печати

Мой код:

 pattern1 = re.compile(r'critical', re.IGNORECASE) pattern2 = re.compile(r'gouting bile', re.IGNORECASE)  for file in os.listdir('/home/ea/medical'):  if re.findall(pattern1, file) and re.findall(pattern2, file):  status = 3  print(file, "Status: ", status)  elsif re.findall(pattern1, file) and not re.findall(pattern2, file):  status = 2  print(file, "Status: ", status)  else:  status = 1  print(file, "Status: ", status)  

Моя проблема в том, что это ничего не возвращает.

Комментарии:

1. Что делать, если он содержит шаблон 2, но не шаблон 1?

2. Вам не нужно использовать findall() . Вам нужно только знать, есть ли хотя бы одно совпадение, так что просто используйте re.search() .

3. @Бармар — Не то условие, о котором мы заботимся. Спасибо, что спросили!

4. Что произвело на вас такое впечатление? Второй аргумент re.findall() -строка, он возвращает все совпадения шаблона, найденного в этой строке. Как он должен знать, что строка является именем файла, и он должен прочитать файл?

5. Не говоря уже о том, что file в нем даже нет каталога. Так что, даже если бы он прочитал файл, он не знал бы, где его найти.

Ответ №1:

вам нужно прочитать файлы, вы просто сверяете шаблоны с именами файлов.

 for file in os.listdir('/home/ea/medical'):  contents = open(os.path.join('/home/ea/medical', file)).read()  status = 1  if re.search(pattern1, contents):  status  = 1  if re.search(pattern2, contents):  status  = 1  print(f"{file} Status: {status}")