Comportement différent entre re.finditer et re.findall
J’obtiens cet exemple à partir d’opérations d’expression régulière en Python 2.* Documentation et cet exemple bien décrit ici en détail avec quelques modifications. Pour expliquer l’exemple entier, obtenons un appel de variable de type chaîne,
text = "He was carefully disguised but captured quickly by police."
et le modèle d’expression régulière de type compile comme,
regEX = r"\w+ly"pattern = re.compile(regEX)
\w
mean correspond à n’importe quel caractère de mot (alphanumérique & trait de soulignement), +
mean correspond à 1 ou plus du jeton précédent et la signification entière est de sélectionner n’importe quel mot qui se termine par ly
. Il n’y a que deux mots 2 (« soigneusement » et « rapidement ») qui satisfont l’expression régulière ci-dessus.
Avant de passer à re.findall() ou re.finditer(), voyons ce que fait re.search() signifie en Python 2.* Documentation.
Parcourez la chaîne à la recherche du premier emplacement où le modèle d’expression régulière produit une correspondance et renvoyez une instance de MatchObject correspondante. Renvoie None si aucune position dans la chaîne ne correspond au motif; notez que cela est différent de la recherche d’une correspondance de longueur nulle à un moment donné de la chaîne.
Les lignes de code suivantes vous donnent la compréhension de base de re.rechercher().
search = pattern.search(text)print(search)print(type(search))#output<re.Match object; span=(7, 16), match='carefully'><class 're.Match'>
Il va générer re.MatchObject d’objet de type classe qui ont 13 méthodes et attributs pris en charge selon Python 2.* Documentation. Cette méthode span() consiste en les points de début et de fin (7 et 16 présents dans l’exemple ci-dessus) du mot correspondant dans la variable text
. re.la méthode search() ne considère que la toute première correspondance, sinon renvoie None
.
Passons à la question, avant cela, voyons ce que fait re.finditer() signifie en Python 2.* Documentation.
Renvoie un itérateur produisant des instances MatchObject sur toutes les correspondances qui ne se chevauchent pas pour le motif RE dans la chaîne. La chaîne est analysée de gauche à droite et les correspondances sont renvoyées dans l’ordre trouvé. Les correspondances vides sont incluses dans le résultat.
Les lignes de code suivantes vous donnent la compréhension de base de re.finditer().
finditer = pattern.finditer(text)print(finditer)print(type(finditer))#output<callable_iterator object at 0x040BB690><class 'callable_iterator'>
L’exemple ci-dessus nous donne les objets Itérateurs qui doivent être en boucle. Ce n’est évidemment pas le résultat que nous voulons. Bouclons finditer
et voyons ce qu’il y a à l’intérieur de ces objets Itérateurs.
for anObject in finditer: print(anObject) print(type(anObject)) print()#output<re.Match object; span=(7, 16), match='carefully'><class 're.Match'><re.Match object; span=(40, 47), match='quickly'><class 're.Match'>
Ces résultats sont très similaires à ceux du re.résultat de la recherche () que nous obtenons plus tôt. Mais nous pouvons voir le nouveau résultat dans la sortie ci-dessus, <re.Match object; span=(40, 47), match='quickly'>
. Comme je le mentionne plus tôt dans Python 2.* Documentation, ré.search() parcourra la chaîne à la recherche du premier emplacement où le modèle d’expression régulière produit une correspondance et re.finditer() parcourra la chaîne à la recherche de tous les emplacements où le modèle d’expression régulière produit des correspondances et renverra plus de détails que re.méthode findall().
Ici qu’est-ce que re.findall() signifie en Python 2.* Documentation.
Renvoie toutes les correspondances de motif qui ne se chevauchent pas dans une chaîne, sous forme de liste de chaînes. La chaîne est analysée de gauche à droite et les correspondances sont renvoyées dans l’ordre trouvé. Si un ou plusieurs groupes sont présents dans le modèle, renvoyez une liste de groupes ; ce sera une liste de tuples si le modèle a plus d’un groupe. Les correspondances vides sont incluses dans le résultat.
Comprenons ce qui se passe dans re.findall().
findall = pattern.findall(text)print(findall)print(type(findall))#output<class 'list'>
Cette sortie ne nous donne que les mots correspondants dans la variable text
, sinon renvoie une liste vide. Cette liste dans la sortie qui est similaire à l’attribut match
dans re.MatchObject.
Voici le code complet et j’ai essayé en Python 3.7.
import retext = "He was carefully disguised but captured quickly by police."regEX = r"\w+ly"pattern = re.compile(regEX)search = pattern.search(text)print(search)print(type(search))print()findall = pattern.findall(text)print(findall)print(type(findall))print()finditer = pattern.finditer(text)print(finditer)print(type(finditer))print()for anObject in finditer: print(anObject) print(type(anObject)) print()