Forskjellig oppforsel mellom re.finditer og re.findall

jeg får dette eksemplet Fra Regulære uttrykksoperasjoner I Python 2.* Dokumentasjon og som eksempel godt beskrevet her i detaljer med noen endringer. For å forklare hele eksemplet, la oss få streng type variabel samtale,

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

og kompilere typen regulært uttrykksmønster som,

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

\w mean matcher et hvilket som helst ordtegn (alfanumerisk & understrek), + mean matcher 1 eller flere av det foregående token, og hele meningen er å velge et hvilket som helst ord som ender opp med ly. Det er bare to 2 ord (‘nøye’ og ‘raskt’) som er fornøyd over regulære uttrykk.

før flytte inn re.findall () eller re.finditer(), la oss se hva som gjor re.søk () mener I Python 2.* Dokumentasjon.

Skann gjennom streng på jakt etter det første stedet der det regulære uttrykksmønsteret produserer et samsvar, og returner en tilsvarende MatchObject-forekomst. Returner Ingen hvis ingen posisjon i strengen samsvarer med mønsteret; merk at dette er forskjellig fra å finne en null-lengde kamp på et tidspunkt i strengen.

Folgende kodelinjer gir deg grunnleggende forstaelse av re.søk().

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

det vil generere re.MatchObject av klasse type objekt som har 13 av stottede metoder og attributter i henhold Til Python 2.* Dokumentasjon. Denne span () – metoden består av start-og sluttpunktene(7 og 16 til stede i eksemplet ovenfor) av det samsvarende ordet i text – variabelen. re.søk () metoden bare vurdere om den aller første kampen, ellers returnere None.

La oss gå inn i spørsmålet, før det ser hva som gjør re.finditer () betyr I Python 2.* Dokumentasjon.

Returner en iterator som gir MatchObject-forekomster over alle ikke-overlappende kamper FOR RE-mønsteret i strengen. Strengen skannes fra venstre mot høyre, og treff returneres i funnet rekkefølge. Tomme kamper er inkludert i resultatet.

Kommer neste kodelinjer gir deg grunnleggende forstaelse av re.finditer ().

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

eksemplet ovenfor gir oss Iteratorobjektene som må være sløyfe. Dette er åpenbart ikke resultatet vi ønsker. La oss sløyfe finditer og se hva som er inne i Dette Iteratorobjektene.

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

disse resultatene ligner mye på re.søk () resultat som vi får tidligere. Men vi kan se det nye resultatet i overutgangen, <re.Match object; span=(40, 47), match='quickly'>. Som jeg nevnte Tidligere I Python 2.* Dokumentasjon, re.søk () vil skanne gjennom streng på jakt etter det første stedet der det vanlige uttrykksmønsteret gir en kamp og re.finditer () vil skanne gjennom streng på jakt etter alle stedene der det vanlige uttrykksmønsteret produserer kamper og returnere flere detaljer enn re.findall () metode.

Her hva betyr re.findall () betyr I Python 2.* Dokumentasjon.

Returner alle ikke-overlappende treff av mønster i streng, som en liste over strenger. Strengen skannes fra venstre mot høyre, og treff returneres i funnet rekkefølge. Hvis en eller flere grupper er til stede i mønsteret, returnere en liste over grupper; dette vil være en liste over tupler hvis mønsteret har mer enn en gruppe. Tomme kamper er inkludert i resultatet.

La oss forstå hva som skjer i re.findall().

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

denne utgangen gir oss bare de samsvarende ordene i text variabel, ellers returnerer en tom liste. Den listen i utgangen som ligner på match attributtet i re.MatchObject.

Her er den fulle koden og jeg prøvde I 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()