Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 8, 2007 15:17:41

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

Автоматом сформировать regexp для набора масок файлов?

Хочу рассортировать файлы по расширениям и применять к ним какие-то заданные пользователем действия.

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

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') – как с такими поступать?



Офлайн

#2 Авг. 9, 2007 10:15:41

redixin
От:
Зарегистрирован: 2006-11-27
Сообщения: 66
Репутация: +  1  -
Профиль   Отправить e-mail  

Автоматом сформировать regexp для набора масок файлов?

>>> extentions =
>>> fname = ‘test.py’
>>> extention = fname
>>> extention in extentions
True

регулярные выражения для таких делов это слишком..



Офлайн

#3 Авг. 9, 2007 11:33:54

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

Автоматом сформировать regexp для набора масок файлов?

Вы не поняли сути моей задачи. Мне нужен не просто флаг, что расширение совпадает, мне нужно знать какому набору оно соответствует из имеющегося ансамбля. Просто делать это в цикле – простой тупой вариант, но мне нужна скорость. Потому что файлов будет очень много.



Офлайн

#4 Авг. 9, 2007 12:51:06

nss
От:
Зарегистрирован: 2007-01-06
Сообщения: 103
Репутация: +  0  -
Профиль   Отправить e-mail  

Автоматом сформировать regexp для набора масок файлов?

>>> 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



Офлайн

#5 Авг. 9, 2007 13:17:20

redixin
От:
Зарегистрирован: 2006-11-27
Сообщения: 66
Репутация: +  1  -
Профиль   Отправить e-mail  

Автоматом сформировать regexp для набора масок файлов?

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
не понимаю каким боком тут помогут регекспы..



Офлайн

#6 Авг. 9, 2007 13:28:10

bialix
От:
Зарегистрирован: 2006-07-13
Сообщения: 774
Репутация: +  1  -
Профиль   Отправить e-mail  

Автоматом сформировать regexp для набора масок файлов?

последний вариант наверное уже близко к тому что надо, в конце концов нужно просто разделить набор расширений ‘*.c *.h’ на несколько ключей в словаре.

redixin: спасибо за наводку. сделаю примерно в таком ключе, но пооптимальнее. А вам посоветую для расширения кругозора почитать http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version