comportamento diferente entre re.finditer and re.findall

recebo este exemplo de operações de expressão Regular no Python 2.* Documentação e este exemplo bem descrito aqui em detalhes com alguma modificação. Para explicar todo o exemplo, vamos obter variável do tipo string chamada,

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

e o tipo de compilação padrão de expressão regular como,

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

\w média corresponde a qualquer caractere (alfanuméricos & sublinhado), + média corresponde a 1 ou mais do que o anterior e o token de todo o significado é selecionar qualquer palavra, que é terminar com ly. Existem apenas duas palavras (“cuidadosamente” e “rapidamente”) que satisfazem a expressão regular acima.

Antes de se mudar para re.findall () or re.finditer (), vamos ver o que faz re.search () mean in Python 2.* Documentacao.

pesquisar através da cadeia procurando o primeiro local onde o padrão de expressão regular produz uma correspondência, e retornar uma instância de MatchObject correspondente. Não devolver nenhuma se nenhuma posição no texto corresponder ao padrão; lembre-se que isto é diferente de encontrar uma correspondência de tamanho zero em algum ponto do texto.

seguindo linhas de código dá-Lhe a compreensão básica de re.pesquisa().

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

irá gerar re.MatchObject of class type object which have 13 of supported methods and attributes according to Python 2.* Documentacao. Este método de calibração() consiste com os pontos de início e fim(7 e 16 presentes no exemplo acima) da palavra correspondente em text variável. reu.o método search () só considera a primeira ocorrência, caso contrário devolve None.

vamos avançar para a questão, antes que isso veja o que faz re.finditer () média em Python 2.* Documentacao.

Return an iterator yielding MatchObject instances over all non-overlapping matches for the re pattern in string. O texto é digitalizado da esquerda para a direita, e as correspondências são devolvidas na ordem encontrada. As correspondências vazias estão incluídas no resultado.

a próxima linha de código dá-Lhe a compreensão básica de re.finditer ().

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

o exemplo acima nos dá os objetos iteradores que precisam ser loop. É evidente que este não é o resultado que pretendemos. Vamos fazer um loop finditer e ver o que está dentro destes objectos 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'>

estes resultados são muito semelhantes aos re.pesquisa () resultado que obtemos mais cedo. Mas podemos ver o novo resultado acima da saída, <re.Match object; span=(40, 47), match='quickly'>. Como mencionei anteriormente em Python 2.* Documentation, re.search () irá pesquisar através de string procurando o primeiro local onde o padrão de expressão regular produz uma correspondência e re.o finditer () irá pesquisar através do texto à procura de todos os locais onde o padrão de expressão regular produz fósforos e devolve mais detalhes do que re.método findall ().

aqui o que faz re.média em Python 2.* Documentacao.

Return all non-overlapping matches of pattern in string, as a list of strings. O texto é digitalizado da esquerda para a direita, e as correspondências são devolvidas na ordem encontrada. Se um ou mais grupos estiverem presentes no padrão, retorne uma lista de grupos; esta será uma lista de tuplas se o padrão tiver mais de um grupo. As correspondências vazias estão incluídas no resultado.

vamos entender o que acontece em re.findall ().

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

esta saída apenas nos dá as palavras correspondentes em text variável, caso contrário devolve uma lista vazia. Essa lista na saída que é semelhante ao atributo match em re.MatchObject.

aqui está o código completo e eu tentei em 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()