Форум сайта python.su
Всем привет!
Народ, хочу написать функцию, возвращающую имена файлов в каталоге, но при этом фильтровать по маске правил (регулярными выражениями) на включение/исключение. Проблема в том, что если маска на исключение не задана, то функция работает некорректно… как можно более элегантно решить проблему?
def my_search(path, include_mask="", exclude_mask=""): my_path = Path(path) return [str(my_file.name) for my_file in my_path.glob("*") if re.search(include_mask, str(my_file)) and not re.search(exclude_mask, str(my_file)) ]
Офлайн
grif_rift
как можно более элегантно решить проблему?
если exclude_mask:
делать с exclude_mask
иначе:
делать без него
Офлайн
xam1816
Офлайн
grif_riftтогда нужно правильно составить регулярное выражение, которое будет учитывать что искать.
Хотелось бы, как-то умнее и элегантнее
if re.search(include_mask, str(my_file)) and not re.search(exclude_mask, str(my_file)
Офлайн
xam1816Не очень удобно. Поскольку условия могут быть записаны в разных местах и проще их описывать разными переменными. Чтобы “слепить” два условия - лишний костыль. Проще и интуитивнее одним правилом
Офлайн
grif_riftприведи примеры названия файлов, и что нужно получить на выходе
Не очень удобно. Поскольку условия могут быть записаны в разных местах и проще их описывать разными переменными. Чтобы “слепить” два условия - лишний костыль. Проще и интуитивнее одним правилом
Офлайн
xam1816Любые файлы с компьютера
Офлайн
В таком случае, раз вы уже пользуетесь рагулярками - используйте исключения самих рагулярок
если исключеий нет - то просто не добавляем в зпрос их и все.
Офлайн
import os import re def find_file(dir, regex=None): for root_dir, _, filenames in os.walk(dir): for filename in filenames: path = os.path.join(root_dir, filename) if regex: pattern = re.compile(regex) if pattern.search(path): yield path else: yield path for f in find_file('/home/xam/Загрузки', '\.txt$'): print(f)
Офлайн