2 votes

Impossible de comprendre le comportement de pattern.findall() en python

Etant naïf en Python, en apprenant un module en Python, j'ai trouvé quelque chose d'étrange (je ne suis pas capable de le comprendre) :

import re

pattern = re.compile(r'[0-9]{3}-[0-9]{3}-[0-9]{4}')
list_phoneNumbers = pattern.findall('phone number : 123-456-7894, my home number : 789-456-1235')
print(list_phoneNumbers)

pattern = re.compile(r'bat(wo)?man')
batman_match = pattern.search('batman is there')
batwoman_match = pattern.search('batwoman is there')
bat_list_all = pattern.findall('batman is there but not batwoman')

print(batman_match.group())
print(batwoman_match.group())
print(bat_list_all)

Sortie :

['123-456-7894', '789-456-1235']
batman
batwoman
['', 'wo']

Comment se fait-il que print(bat_list_all) n'a pas donné la liste ['batman', 'batwoman'] ? Qu'est-ce que je ne comprends pas ?

4voto

azro Points 11463

C'est parce que vous utilisez un groupe (wo)? donc findall renvoie ce qui correspond à ce groupe :

  • '' para batman
  • 'wo' para batwoman

Vous pouvez utiliser un non-matching group : pattern = re.compile(r'bat(?:wo)?man')


re.findall() : retourne toutes les correspondances non chevauchantes du motif dans la chaîne de caractères, sous forme de liste de chaînes de caractères. La chaîne est parcourue de gauche à droite, et les correspondances sont retournées dans l'ordre trouvé. Si un ou plusieurs groupes sont présents dans le motif, retournez une liste de groupes. ; ce sera une liste de tuples si le motif a plus d'un groupe. Les correspondances vides sont incluses dans le résultat.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X