olika beteende mellan re.finditer och re.findall

jag får detta exempel från reguljära uttrycksoperationer i Python 2.* Dokumentation och det exemplet beskrivs väl här i detaljer med viss modifiering. För att förklara hela exemplet, låt oss få sträng typ variabel samtal,

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

och kompileringstypen reguljära uttrycksmönster som,

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

\w medelvärde matchar alla ordtecken (alfanumerisk & understreck), +medelvärde matchar 1 eller flera av föregående token och hela meningen är Välj ett ord som slutar med ly. Det finns bara två 2-ord (’försiktigt ’och’ snabbt’) som är nöjda med ovanstående reguljära uttryck.

innan flytta in re.findall () eller re.finditer (), låt oss se vad som gör re.sök () betyder i Python 2.* Dokumentation.

skanna genom strängen och leta efter den första platsen där det reguljära uttrycksmönstret ger en matchning och returnera en motsvarande matchobject-instans. Returnera ingen om ingen position i strängen matchar mönstret; Observera att detta skiljer sig från att hitta en nolllängdsmatchning någon gång i strängen.

följande kodrader ger dig grundläggande förstå re.söka().

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

det kommer att generera re.MatchObject av klass Typ objekt som har 13 av stödda metoder och attribut enligt Python 2.* Dokumentation. Denna span () – metod består av start-och slutpunkterna(7 och 16 närvarande i exemplet ovan) för det matchade ordet i text variabel. åter.sök () metod bara överväga om den allra första matchen, annars tillbaka None.

Låt oss gå in i frågan, innan det ser vad som gör re.finditer () betyder i Python 2.* Dokumentation.

returnera en iterator som ger MatchObject-instanser över alla icke-överlappande matchningar för re-mönstret i sträng. Strängen skannas från vänster till höger och matchningar returneras i den ordning som hittades. Tomma matcher ingår i resultatet.

kommande nästa kodrader ger dig grundläggande förstå re.finditer ().

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

ovanstående exempel ger oss Iteratorobjekten som måste vara loop. Detta är uppenbarligen inte det resultat vi vill ha. Låt oss loop finditer och se vad som finns i denna Iterator objekt.

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

detta resultat är mycket lik re.Sök () resultat som vi får tidigare. Men vi kan se det nya resultatet i ovanstående produktion, <re.Match object; span=(40, 47), match='quickly'>. Som jag nämnde tidigare i Python 2.* Dokumentation, re.search () kommer att skanna genom sträng letar efter den första platsen där det reguljära uttrycket mönstret ger en match och re.finditer () kommer att skanna genom sträng letar efter alla de platser där det reguljära uttrycket mönstret producerar matcher och returnera mer information än re.findall () metod.

här vad gör re.findall () betyder i Python 2.* Dokumentation.

returnera alla icke överlappande matchningar av mönster i sträng, som en lista med strängar. Strängen skannas från vänster till höger och matchningar returneras i den ordning som hittades. Om en eller flera grupper finns i mönstret, returnera en lista med grupper; detta kommer att vara en lista med tupler om mönstret har mer än en grupp. Tomma matcher ingår i resultatet.

Låt oss förstå vad som händer i re.findall ().

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

denna utgång ger oss bara de matchade orden i text variabel, annars returnerar en tom lista. Den listan i utmatningen som liknar attributet match i re.MatchObject.

här är hela koden och jag försökte 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()