verschillend gedrag tussen re.finditer en re.findall

ik krijg dit voorbeeld uit reguliere expressiebewerkingen in Python 2.* Documentatie en dat voorbeeld goed beschreven hier in detail met enige wijziging. Om het hele voorbeeld uit te leggen, laten we stringtype variabele aanroep krijgen,

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

en het compileertype reguliere expressie patroon als,

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

\w mean komt overeen met elk woordteken (alfanumeriek & underscore), + mean komt overeen met 1 of meer van het voorgaande token en de hele betekenis is elk woord selecteren dat eindigt op ly. Er zijn slechts twee 2 woorden (‘zorgvuldig ‘en’ snel’) die voldoen aan de bovenstaande reguliere expressie.

voordat u overgaat naar re.findall () of re.finditer (), laten we eens kijken wat doet re.search() mean in Python 2.* Documentatie.

Scan door de tekenreeks op zoek naar de eerste locatie waar het reguliere expressiepatroon een overeenkomst produceert, en retourneer een corresponderende matchobject instantie. Geef geen terug als er geen positie in de string overeenkomt met het patroon; merk op dat dit anders is dan het vinden van een nullengte overeenkomst op een bepaald punt in de string.

de volgende coderegels geven u de basiskennis van re.zoeken().

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

het genereert re.MatchObject van klasse type object die 13 van ondersteunde methoden en attributen volgens Python 2.* Documentatie. Deze span () methode bestaat uit de begin-en eindpunten(7 en 16 aanwezig in het bovenstaande voorbeeld) van het overeenkomende woord in text variabele. re.search () methode alleen overwegen over de allereerste overeenkomst, anders return None.

laten we naar de vraag gaan, voordat we zien wat re doet.finditer() betekent in Python 2.* Documentatie.

Geef een iterator terug die matchobject-instanties oplevert over alle niet-overlappende overeenkomsten voor het RE-patroon in string. De tekenreeks wordt van links naar rechts gescand, en overeenkomsten worden geretourneerd in de gevonden volgorde. Lege wedstrijden zijn opgenomen in het resultaat.

volgende coderegels geven u de basiskennis van re.finditer ().

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

het bovenstaande voorbeeld geeft ons de Iteratorobjecten die lus moeten zijn. Dat is natuurlijk niet het resultaat dat wij willen. Laten we finditer lusenom te zien wat er in deze Iterator objecten zit.

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

deze resultaten lijken veel op de re.search () resultaat dat we eerder krijgen. Maar we kunnen het nieuwe resultaat zien in bovenstaande output, <re.Match object; span=(40, 47), match='quickly'>. Zoals ik eerder in Python 2 vermeld.* Documentation, re.search () scant door string op zoek naar de eerste locatie waar het reguliere expressiepatroon een match en re produceert.finditer () scant door string op zoek naar alle locaties waar het reguliere expressiepatroon wedstrijden produceert en retourneert meer details dan re.findall () methode.

hier wat doet re.findall() betekent in Python 2.* Documentatie.

retourneer alle niet-overlappende overeenkomsten van patroon in string, als een lijst van strings. De tekenreeks wordt van links naar rechts gescand, en overeenkomsten worden geretourneerd in de gevonden volgorde. Als een of meer groepen aanwezig zijn in het patroon, retourneer dan een lijst van groepen; dit zal een lijst van tupels zijn als het patroon meer dan één groep heeft. Lege wedstrijden zijn opgenomen in het resultaat.

laten we begrijpen wat er gebeurt in re.findall ().

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

deze uitvoer geeft ons alleen de overeenkomende woorden in text variabele, anders retourneert u een lege lijst. Die lijst in de uitvoer die vergelijkbaar is met het match attribuut in re.MatchObject.

hier is de volledige code en ik heb het geprobeerd in 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()