2009-03-05 5 views
2

essaie l'expression régulière suivante en python, mais il renvoie une erreurPourquoi l'expression régulière renvoie-t-elle une erreur dans python?

import re 
... 

#read a line from a file to variable line 
# loking for the pattern 'WORD' in the line ... 

m=re.search('(?<=[WORD])\w+',str(line)) 
m.group(0) 

i l'erreur suivante:

AttributeError: objet 'NoneType' n'a pas d'attribut 'groupe'

Répondre

4

Cela arrive parce que l'expression régulière n'a pas été appariée. Donc m est None et bien sûr vous ne pouvez pas accéder au groupe [0]. Vous devez d'abord tester que la recherche a réussi, avant d'essayer d'accéder aux membres du groupe.

+0

C'est en fait m qui est None. (Minuscule nit.) –

2
>>> help(re.search) 
Help on function search in module re: 

search(pattern, string, flags=0) 
    Scan through string looking for a match to the pattern, returning 
    a match object, or None if no match was found. 

Regardez la dernière ligne: Aucun retour si aucune correspondance n'a été trouvée

1

BTW, l'expression régulière est incorrecte. Si vous cherchez 'WORD', ce devrait être simplement 'WORD'. str est également étranger. Votre code devrait ressembler à ceci:

m = re.search('WORD', line) 
if m: 
    print m.group[0] 

Votre regexp original retourner des résultats probablement inattendus et non désirés:

>>> m = re.search('(?<=[WORD])\w+', 'WORDnet') 
>>> m.group(0) 
'ORDnet' 
3

Deux questions:

  1. votre modèle ne correspond donc pas m est défini sur None et None n'a pas d'attribut group.

  2. Je crois que vous vouliez dire soit:

    m= re.search(r"(?<=WORD)\w+", str(line)) 
    

    comme entrée ou

    m= re.search(r"(?P<WORD>\w+)", str(line)) 
    

    Les anciens matchs "abc" dans "WORDabc def"; le dernier correspond à "abc" dans "abc def" et l'objet de correspondance aura un .group("WORD") contenant "abc". (L'utilisation de r "" chaînes est généralement une bonne idée lorsque vous spécifiez des expressions régulières.)

Questions connexes