#python #regex
Вопрос:
У меня есть каталог текстовых файлов. Мне нужно установить статус для каждого файла в зависимости от того, соответствует ли он 1, обоим или ни одному из шаблонов регулярных выражений. Мой план таков:
- Каталог прогулок
- Если содержимое файла:
- не соответствует ни одному шаблону, статус = 1
- соответствует шаблону 1, НО НЕ шаблону 2, статус = 2
- соответствует шаблону 2, НО НЕ шаблону 1, игнорировать
- соответствует шаблону1 И шаблону2, статус = 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}")