2013-05-07 2 views
1

Je souhaite "grep" plusieurs expressions rationnelles sur plusieurs fichiers. J'ai tous ces regex dans un fichier (un par ligne), que je charge de la manière suivante, la construction d'un « super regex »:Python: Comment rechercher plusieurs paterns dans plusieurs fichiers

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

Puis-je consulter mes fichiers comme ceci:

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

Cela fonctionne. Je pense que ce n'est vraiment pas efficace et dangereux (certains regex dans le dic pourraient casser le "super regex"). Je pensais à en boucle dans le tableau regex, mais cela signifierait de numériser chaque fichier plusieurs fois:/

Une idée brillante sur la façon de faire cela? Merci!

+0

Je ne vois vraiment pas de problème avec ça. Pas nécessairement particulièrement élégant, mais comme vous le dites, il fait le travail avec une efficacité relative. – jdotjdot

Répondre

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

Ceci prendra soin des regex malformées.

Questions connexes