2010-03-22 3 views
0

J'ai une liste de variables:Trouver plusieurs regex dans chaque ligne et sauter le résultat si l'un des regex ne correspond pas à

variables = ['VariableA', 'VariableB','VariableC'] 

que je vais rechercher, ligne par ligne

ifile = open("temp.txt",'r') 

d = {} 

match = zeros(len(variables)) 
for line in ifile: 
    emptyCells=0 
    for i in range(len(variables)): 
     regex = r'('+variables[i]+r')[:|=|\(](-?\d+(?:\.\d+)?)(?:\))?' 
     pattern_variable = re.compile(regex) 
     match[i] = re.findall(pattern_variable, line) 

     if match[j] == []: 
      emptyCells = emptyCells+1 

    if emptyCells == 0: 
     for k, v in match[j]: 
      d.setdefault(k, []).append(v) 

L'exigence est que je ne garderai que les lignes où tous les regex correspondent!

Je veux collecter tous les résultats pour chaque variable dans un dictionnaire où le nom de la variable est la clé, et la valeur devient une liste de tous les résultats.

Le code fourni est seulement ce que j'ai trouvé à ce jour, et ne fonctionne pas encore parfaitement ...

+0

u peut utiliser: cat file | grep regexp1 | grep regexp2 | ... – Drakosha

+0

Il est supposé fonctionner dans un environnement Windows, donc en fonction des utilitaires unix, je ne pense pas ... – user265978

+0

Votre code fait référence à une variable 'j' sans jamais définir' j'. Est-ce que 'j' a été défini ailleurs ou est-ce censé être' i'? Précisez s'il vous plaît. – unutbu

Répondre

1

Pouvez-vous modifier votre question pour donner un exemple du fichier source, afin que nous puissions tester notre des solutions contre cela?

Quoi qu'il en soit voici un hack rapide:

from collections import defaultdict 
import re 

variables = ['VariableA', 'VariableB', 'VariableC'] 
regexes = [re.compile(r'(%s)[:|=|\(](-?\d+(?:\.\d+)?)(?:\))?' % (variable,)) 
      for variable in variables] 
d = defaultdict(list) 

with open("temp.txt") as f: 
    for line in f: 
     results = [regex.search(line) for regex in regexes] 
     if all(results): 
      for m in results: 
       k, v = m.groups() 
       d[k].append(v) 

print d 
+0

Cela fonctionne parfaitement !! Très belle solution, merci! Une ligne typique dans le fichier source: VariableA (2) 00:29:10 VariableB = 0.221 VariableC: 12.600 sensI = 0.000 – user265978

Questions connexes