2016-12-14 5 views
-2

Je dois écrire une regex python qui correspondra à un mot qui se trouve à côté du mot correspondant. Mais le mot suivant peut être dans la ligne suivante ou peut être la même ligne.Recherche de la ligne suivante

Par exemple:

""" 
Running /health_checks/system_checks1  [ FAIL ] 
Running /health_checks/system_checks2  [ PASS ] 
Running /health_checks/system_checks3   
             [ PASS ] 
""" 

Après system_checks3 il y a nouvelle ligne et le résultat de la vérification.

Je veux le résultat comme:

system_checks2 PASS 
system_checks3 PASS 

et ainsi de suite

+1

Vous semblez avoir oublié de poser une question. Aucun problème n'est indiqué dans le message. –

+0

Je veux le résultat comme: system_checks2 PASS, system_checks3 PASS et ainsi de suite –

+0

Je ne pense pas regex est un bon outil pour cela. Le mieux serait de rendre la production plus structurée en premier lieu. Si cela est impossible, vous pouvez toujours obtenir des résultats avec split(). Par exemple, il semble que ce soit une bonne idée de supprimer simplement les sauts de ligne, de créer une longue chaîne et d'appeler split ("running") dessus. alors vous pouvez rechercher la sous-chaîne dans [] facilement – lhk

Répondre

0

Je pense que la meilleure façon serait d'utiliser un autre format de sortie en premier lieu. Utiliser regex pour analyser la sortie est rarement une bonne idée, le code se casse trop facilement: à un certain point, la sortie sera modifiée, votre programme se cassera, et lire regex à nouveau après un mois est un mal de tête.

En supposant que vous ne pouvez pas modifier le format de sortie, je recommanderais quand même de ne pas utiliser d'expressions rationnelles. Vous voudrez peut-être regarder dans la fonction python split(), voici une version utilisant:

string=""" 
Running /health_checks/system_checks1  [ FAIL ] 
Running /health_checks/system_checks2  [ PASS ] 
Running /health_checks/system_checks3   
             [ PASS ] 
""" 

# remove newlines 
string = string.replace("\n", "") 

# split into individual jobs 
jobs=string.split("Running") 

# remove empty strings 
jobs=[job for job in jobs if job!=""] 

# take only the part with the result 
results=[] 
for job in jobs: 
    # separate in the process name and the result 
    # assuming the result is always wrapped in [] 
    # then [ can be used as a delimiter 
    splitted=job.split("[") 

    # splitted contains the job name and the result 
    result=splitted[1] 

    # remove the trailing ] 
    result=result.replace("]","") 

    # remove whitespace 
    result=result.strip() 

    results.append(result) 

Le tableau results contient maintenant:

[ 'FAIL', 'PASS', 'PASS']