2013-06-24 3 views
0

Pour m'aider à apprendre les bases de python, je travaille sur un script qui lancera automatiquement un ticket d'assistance chaque fois qu'un nouvel errata du noyau RedHat est publié. Jusqu'à présent, je peux créer une liste de tous les errata, chacun sur sa propre ligne, sous la forme d'une variable à plusieurs lignes. J'espère pouvoir ensuite rechercher dans cette liste complète d'errata pour seulement les éléments qui ont 'kernel' dans la chaîne, et rétrécir la variable juste à ces résultats est là où j'ai des problèmes. Je peux essentiellement trouver toutes les correspondances pour 'kernel' mais plutôt que de retourner le match, il suffit de noter qu'une correspondance a été trouvée. Par exemple:Python re.search dans la boucle pour réduire les résultats

import re 
import datetime 
import urllib 
from BeautifulSoup import BeautifulSoup 

errata = 'http://rhn.redhat.com/errata/rhel-server-6-errata.html' 

errata_data = urllib.urlopen(errata) 
soup = BeautifulSoup(errata_data) 

for syn in soup.findAll(attrs={'id' : re.compile("^synopsis")}): 
     for line in syn: 
       match = re.search("kernel", line, re.MULTILINE) 
       print match 

... résultats dans « aucun » pour les lignes qui ne correspondent pas, et un pointeur de quelque sorte pour désigner quand il trouve une correspondance plutôt que d'imprimer la ligne qui correspond à:

None 
None 
<_sre.SRE_Match object at 0x3f0ed30> 
None 
None 
None 

Merci!

+0

Que voulez-vous dire que vous voulez imprimer "la correspondance"? voulez-vous imprimer la ligne? –

Répondre

0

Qu'est-ce que vous cherchez est:

for line in syn: 
     match = re.search("kernel", line, re.MULTILINE) 
     if match: # gets rid lines that don't match, which return `None` 
      print line 

match est un objet de correspondance qui contient des informations utiles, telles que quelle position le match a eu lieu à. Si vous voulez juste imprimer la ligne correspondante, utilisez print line.

+0

Merci David, cela a résolu mon problème. – user132791

+1

@ user132791: Bien sûr. Notez que vous pouvez marquer la réponse comme acceptée en cliquant sur la coche verte à côté de celle-ci. –

Questions connexes