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