2011-06-06 7 views
0

Est-il possible de lire la longueur de la sortie de re.search?Aide re.search longueur python

Par exemple:

import re 

list=['lost','post','cross','help','cost'] 

for i in range(len(list)): 
    output = re.search('os', list[i]) 

Puis-je lire la longueur de sortie?

+0

Do *** not *** utilise des regexps pour des comparaisons de chaînes simples. De plus, la meilleure façon d'itérer sur une liste est 'pour item in list'. Veuillez lire le [Tutoriel Python] (http://docs.python.org/tutorial/). – ThiefMaster

+0

Longueur de quoi exactement? –

+0

@ThiefMaster: Je sais que RE est trop pour un simple substing, mais re.search est plus rapide que string.find par exemple parce qu'il s'arrête à la première occurrence. Si vous avez beaucoup de ficelles, je préfère utiliser une méthode "anormale", mais obtenir moins de temps. – stdio

Répondre

2

Dans ce cas, la longueur de sortie sera la même que la longueur d'entrée, car vous recherchez une sous-chaîne spécifique. Lorsque vous recherchez dans 'lost', la longueur du match sera 2, parce que c'est la longueur du paramètre de recherche. Maintenant, si vous voulez faire la différence entre "trouvé" et "non trouvé", rappelez-vous que re.search renvoie None s'il n'y a pas de correspondance. Si vous avez vraiment besoin de la longueur, vous pouvez le faire:

for i in range(len(list)): 
    length = 2 if re.search('os', list[i]) else 0 

Je vous recommande d'utiliser une boucle foreach plus typique que:

for item in list: 
    length = 2 if re.search('os', item) else 0 

Et si tout vous vérifiez est si une chaîne apparaît dans un autre, eh bien, vous pouvez utiliser l'opérateur in pour que:

for item in list: 
    length = 2 if 'os' in item else 0 

maintenant, si vous êtes à la recherche d'un regex plus complexe, vous pouvez récupérer groupe 0 fr om la correspondance, qui est la totalité de la sous-chaîne, et en vérifier la longueur:

for item in list: 
    match = re.search('[aeiou]s', item) 
    length = len(match.group(0)) if match else 0 
+0

Maintenant, je comprends ce que retourne la longueur de la sortie re.search ... la longueur de la sous-chaîne! J'étais confus et re.search n'est pas ce dont j'ai besoin. – stdio

0

re.search() renvoie un objet correspondant qui a une méthode span. Cette méthode retourne deux éléments, la position de départ et la position finale de la correspondance.

2

Tout d'abord, l'attribution d'un nouveau nom au list intégré est une très mauvaise idée. Deuxièmement, ce n'est pas une façon très Python d'itérer sur une liste. Toutes les boucles de Python sont pour-chaque boucle, donc simplement faire:

word_list = ['lost','post','cross','help','cost'] 
for word in word_list: 
    match = re.search("os", word) 

Cela dit, vous êtes à la recherche sans doute pour les start et end méthodes d'un match, ce qui vous dire exactement où un match donné commence dans le texte être recherché, et où il se termine.

word_list = ['lost','post','cross','help','cost'] 
for word in word_list: 
    match = re.search("os", word) 
    if match is not None: 
     print match.start(), match.end() 

Évidemment, la différence sera la longueur. Étant donné votre liste de mots, ceci affichera

1 3 
1 3 
2 4 
1 3