Найти - Пользователи
Полная версия: Автоматом сформировать regexp для набора масок файлов?
Начало » Python для экспертов » Автоматом сформировать regexp для набора масок файлов?
1
bialix
Хочу рассортировать файлы по расширениям и применять к ним какие-то заданные пользователем действия.

Например псевдокод:

actions = {'*.txt': func1,
‘*.py’: func2,
‘*.c *.h’: func3}

if filename match action in actions:
actions(filename)


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


pat = re.compile(r'(.*\.txt$)|(.*\.py$)|(.*\.$)')
m = pat.match(filename)
if m:
index = list(m.groups()).index(filename)
actions(filename)


Выглядит немного громоздко, но работает универсально.

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

стандартная либа fnmatch умеет транслировать glob-выражения в regexp, но загвоздка с наборами нескольких масок в одной строке ('*.c *.h *.cpp *.hpp') – как с такими поступать?
redixin
>>> extentions =
>>> fname = ‘test.py’
>>> extention = fname
>>> extention in extentions
True

регулярные выражения для таких делов это слишком..
bialix
Вы не поняли сути моей задачи. Мне нужен не просто флаг, что расширение совпадает, мне нужно знать какому набору оно соответствует из имеющегося ансамбля. Просто делать это в цикле – простой тупой вариант, но мне нужна скорость. Потому что файлов будет очень много.
nss
>>> exts=['py','c','h']
>>> reg=re.compile('|'.join(map(lambda x: r"(.*\.%s$)" % x, exts)))
>>> bool(reg.match("file.py"))
True
>>> bool(reg.match("file.com"))
False
redixin
def func1(fname):
    print 'doing something with ',fname
def func2(fname):
    print 'doing something other with ',fname
def do_some(filelist):
    actions = {'py': func1, 'exe': func2}
    for fname in filelist:
        extention = fname[fname.rfind('.') + 1:]
        if extention in actions.keys():
            actions[extention](fname)
        else:
            print 'no_action'
do_some(['file.py', 'file.pyc', 'file.exe'])

doing something with  file.py
no_action
doing something other with file.exe
не понимаю каким боком тут помогут регекспы..
bialix
последний вариант наверное уже близко к тому что надо, в конце концов нужно просто разделить набор расширений ‘*.c *.h’ на несколько ключей в словаре.

redixin: спасибо за наводку. сделаю примерно в таком ключе, но пооптимальнее. А вам посоветую для расширения кругозора почитать http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB