2013-05-07 3 views
1

Я хочу, чтобы "grep" несколько регулярных выражений на несколько файлов. У меня есть все эти регулярные выражения в файле (по одному в каждой строке), что я загружаю следующим образом, построение «супер регулярное выражение»:Python: как искать несколько paterns в нескольких файлах

dic = open('regex.dic') 
rex = [] 
for l in iter(dic): 
    if not l.startswith('#'): 
     rex.append('^.*%s.*$' % l.strip()) 
rex = '|'.join(rex) 
debug('rex='+rex) 
global regex 
regex = re.compile(rex, re.IGNORECASE|re.MULTILINE) 
dic.close() 

Затем я проверить мои файлы, как это:

with open(fn, 'r') as f: data = f.readlines() 
for i, line in enumerate(data): 
    if len(line) <= 512: #Sanity check 
     if regex.search(line): 
      if not alreadyFound: 
       log("[!]Found in %s:" % fn) 
       alreadyFound = True 
       found = True 
       copyFile(fn) 
      log("\t%s" % '\t'.join(data[i-args.context:i+args.context+1]).strip()) 

Это работает. Я чувствую, что это действительно неэффективно и опасно (некоторое регулярное выражение в dic может сломать «супер-регулярное выражение»). Я думал о циклах в массиве регулярных выражений, но это означало бы сканирование каждого файла несколько раз:/

Любая блестящая идея о том, как это сделать? Благодаря!

+0

На самом деле я действительно не вижу проблемы с этим. Не обязательно особенно элегантный, но, как вы говорите, он выполняет свою работу с относительной эффективностью. – jdotjdot

ответ

1
if l and l[0] != '#': 
    try: 
     re.compile(s) 
    except: 
     #handle any way you want 
    else: 
     rex.append('^.*({0}).*$'.format(l.strip())) 

Это позаботится о неправильных регулярных выражениях.

Смежные вопросы