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()