különböző viselkedés között re.finditer és re.findall

ezt a példát a Python 2 reguláris kifejezési műveleteiből kapom.* Dokumentáció és a példa jól leírt itt részletesen néhány módosítással. Megmagyarázni egész példa, nézzük kap string típusú változó hívás,

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

a compile type reguláris kifejezés mintája,

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

\w az átlag megfelel bármely szó karakternek (alfanumerikus & aláhúzás), + az átlag megfelel az előző token 1 vagy több elemének, és az egész jelentés azt jelenti, hogy válasszon ki egy szót, amely ly-vel végződik. Már csak két 2 szó (‘óvatosan’ és ‘gyorsan’), amely megfelel a fenti reguláris kifejezés.

mielőtt beköltözik re.findall () vagy újra.finditer (), lássuk, mit jelent újra.keresés () jelenti Python 2.* Dokumentáció.

szkennelje át a karakterláncot, megkeresve az első helyet, ahol a reguláris kifejezési minta egyezést hoz létre, majd adja vissza a megfelelő MatchObject példányt. Vissza Nincs ha a karakterlánc egyik pozíciója sem felel meg a mintának; vegye figyelembe, hogy ez különbözik attól, hogy a karakterlánc egy pontján nulla hosszúságú egyezést találjon.

következő kódsorokat ad az alapvető megérteni újra.keresés ().

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

ez generál újra.MatchObject osztály típusú objektum, amely 13 támogatott módszerek és attribútumok szerint Python 2.* Dokumentáció. Ez a span () metódus az egyező szó text változójának kezdő és végpontjait tartalmazza(7 és 16 jelen van a fenti példában). re.keresés() módszer csak akkor fontolja meg a legelső mérkőzés, különben vissza None.

térjünk át a kérdésre, mielőtt, hogy mit jelent újra.finditer () jelenti Python 2.* Dokumentáció.

visszaad egy iterátort, amely MatchObject példányokat eredményez az összes nem átfedő egyezésen a karakterláncban lévő RE mintához. A karakterlánc beolvasása balról jobbra történik, a találatok pedig a talált sorrendben kerülnek visszaadásra. Az üres mérkőzések szerepelnek az eredményben.

Coming next kódsorok megadja az alapvető megérteni újra.finditer ().

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

a fenti példa megadja nekünk az Iterátor objektumokat, amelyeknek huroknak kell lenniük. Nyilvánvalóan nem ezt az eredményt akarjuk. Folytassuk a finditer – et, és nézzük meg, mi van ebben az Iterátor objektumban.

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

ez az eredmény nagyon hasonlít a re.keresés () eredmény, amelyet korábban kapunk. De láthatjuk az új eredményt a fenti kimeneten, <re.Match object; span=(40, 47), match='quickly'>. Ahogy korábban említettem a Python 2-ben.* Dokumentáció, újra.a search() a karakterláncon keresztül keresi az első helyet, ahol a reguláris kifejezésminta egyezést és re-T hoz létre.a finditer() végigpásztázza a karakterláncot, megkeresi az összes olyan helyet, ahol a reguláris kifejezési minta egyezéseket eredményez, és több részletet ad vissza, mint a re.findall () módszer.

itt mit jelent újra.findall () jelentése Python 2.* Dokumentáció.

visszaadja az összes nem átfedő egyezést a stringben, mint a stringek listáját. A karakterlánc beolvasása balról jobbra történik, a találatok pedig a talált sorrendben kerülnek visszaadásra. Ha egy vagy több csoport van jelen a mintában, adja vissza a csoportok listáját; ez lesz a lista a sorokból, ha a mintának több csoportja van. Az üres mérkőzések szerepelnek az eredményben.

értsük meg, mi történik újra.findall ().

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

ez a kimenet csak az egyező szavakat adja meg a text változóban, különben üres listát ad vissza. Ez a lista a kimeneten, amely hasonló a match attribútum re.MatchObject.

itt van a teljes kód, és megpróbáltam a Python 3.7-ben.

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