Comportamiento diferente entre re.finditer y re.findall

Obtengo este ejemplo de operaciones de expresión regular en Python 2.* Documentación y ese ejemplo bien descrito aquí en detalles con alguna modificación. Para explicar el ejemplo completo, vamos a obtener una llamada a variable de tipo string,

text = "He was carefully disguised but captured quickly by police."

y el patrón de expresión regular de tipo compilación como,

regEX = r"\w+ly"pattern = re.compile(regEX)

\w media coincide con cualquier carácter de palabra (alfanumérico & subrayado), + media coincide con 1 o más de la señal anterior y el significado completo es seleccionar cualquier palabra que termine con ly. Solo hay dos palabras de 2(‘cuidadosamente’ y ‘rápidamente’) que satisfacen la expresión regular anterior.

Antes de pasar a re.findall () o re.finditer(), veamos qué hace re.search () significa en Python 2.* Documentación.

Explore la cadena en busca de la primera ubicación donde el patrón de expresión regular produce una coincidencia y devuelva una instancia de objeto de coincidencia correspondiente. Devuelve None si ninguna posición en la cadena coincide con el patrón; tenga en cuenta que esto es diferente de encontrar una coincidencia de longitud cero en algún punto de la cadena.

Las siguientes líneas de código le dan la comprensión básica de re.búsqueda().

search = pattern.search(text)print(search)print(type(search))#output<re.Match object; span=(7, 16), match='carefully'><class 're.Match'>

Generará re.Objeto MatchObject de tipo clase que tiene 13 métodos y atributos compatibles de acuerdo con Python 2.* Documentación. Este método span () consiste en los puntos de inicio y final (7 y 16 presentes en el ejemplo anterior) de la palabra coincidente en la variable text. re.el método search () solo considera la primera coincidencia, de lo contrario devuelve None.

Pasemos a la pregunta, antes de eso veamos qué hace re.finditer () significa en Python 2.* Documentación.

Devuelve un iterador que produce instancias de MatchObject sobre todas las coincidencias no superpuestas para el patrón RE en la cadena. La cadena se escanea de izquierda a derecha, y las coincidencias se devuelven en el orden en que se encontraron. Las coincidencias vacías se incluyen en el resultado.

Las siguientes líneas de código le dan la comprensión básica de re.finditer().

finditer = pattern.finditer(text)print(finditer)print(type(finditer))#output<callable_iterator object at 0x040BB690><class 'callable_iterator'>

El ejemplo anterior nos da los Objetos Iteradores que necesitan ser loop. Obviamente, este no es el resultado que queremos. Hagamos un bucle finditer y veamos qué hay dentro de estos objetos Iteradores.

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'>

Estos resultados son muy similares a los de re.resultado de search () que obtenemos antes. Pero podemos ver el nuevo resultado en la salida anterior, <re.Match object; span=(40, 47), match='quickly'>. Como mencioné anteriormente en Python 2.* Documentation, re.search () escaneará la cadena buscando la primera ubicación donde el patrón de expresión regular produce una coincidencia y re.finditer () escaneará la cadena buscando todas las ubicaciones donde el patrón de expresión regular produce coincidencias y devolverá más detalles que re.método findall ().

Aquí lo que hace re.findall () significa en Python 2.* Documentación.

Devuelve todas las coincidencias no superpuestas del patrón en la cadena, como una lista de cadenas. La cadena se escanea de izquierda a derecha, y las coincidencias se devuelven en el orden en que se encontraron. Si uno o más grupos están presentes en el patrón, devuelve una lista de grupos; esta será una lista de tuplas si el patrón tiene más de un grupo. Las coincidencias vacías se incluyen en el resultado.

Vamos a entender lo que sucede en re.findall ().

findall = pattern.findall(text)print(findall)print(type(findall))#output<class 'list'>

Esta salida solo nos da las palabras coincidentes en la variable text, de lo contrario devuelve una lista vacía. La lista en la salida que sea similar al atributo match en re.Objeto de partido.

Aquí está el código completo y lo probé 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()