2010-05-10 3 views
18

Je veux correspondre à la dernière occurrence d'un motif simple dans une chaîne, par ex.Trouver la dernière correspondance avec l'expression régulière python

list = re.findall(r"\w+ AAAA \w+", "foo bar AAAA foo2 AAAA bar2") 
print "last match: ", list[len(list)-1] 

cependant, si la chaîne est très longue, une liste énorme de résultats est généré. Existe-t-il un moyen plus direct de faire correspondre la deuxième occurrence de "AAAA" ou dois-je utiliser cette solution de contournement?

+6

Une autre option pourrait être d'inverser la chaîne ('mystr [:: - 1]') et de rechercher la première occurrence de l'inverse du modèle. – ChristopheD

+2

@ChristopheD, Gross! La seule chose plus difficile à comprendre qu'une regex est celle qui est en arrière. – mlissner

Répondre

24

vous pouvez utiliser $ qui indique la fin du caractère de la ligne:

>>> s = """foo bar AAAA 
foo2 AAAA bar2""" 
>>> re.findall(r"\w+ AAAA \w+$", s) 
['foo2 AAAA bar2'] 

En outre, notez que list est un mauvais nom pour votre variable, comme des ombres de type intégré. Pour accéder au dernier élément d'une liste que vous pouvez simplement utiliser l'index [-1]:

>>> lst = [2, 3, 4] 
>>> lst[-1] 
4 
+0

Et si je tombais sur une chaîne multiligne? – SDD

+1

@SDD: cela fonctionnerait bien – SilentGhost

+3

Cela ne fonctionnera pas pour une chaîne d'entrée comme ceci: "foo bar AAAA foo2 AAAA bar2 bar3". Bien sûr, nous ne savons pas si un tel cas est possible, nous n'avons pas assez d'informations. – tzot

22

Vous pouvez éviter la construction d'une liste juste en itérer sur tous les matchs et garder le dernier match:

for match in re.finditer(r"\w+ AAAA \w+", "foo bar AAAA foo2 AAAA bar2"): 
    pass 

Après cela, match contient la dernière correspondance, et fonctionne pour toutes les combinaisons de modèle et chaîne recherchée. Vous voudrez peut-être régler match à None d'abord, car s'il n'y a pas de correspondance, match ne sera pas définie sur n'importe quelle valeur.

+0

Ceci est très utile dans beaucoup d'utilisations. Vous souhaiterez généralement remplacer toutes les occurrences d'un motif, puis traiter de façon personnalisée la dernière partie de la chaîne d'entrée. –

Questions connexes