comportament diferit între re.finditer și re.findall

primesc acest exemplu din operațiile de expresie regulată din Python 2.* Documentația și acest exemplu bine descris aici în detalii cu unele modificări. Pentru a explica întregul exemplu, să obținem apel variabil de tip șir,

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

și modelul de expresie regulată de tip compilare ca,

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

\w mean se potrivește cu orice caracter cuvânt (alfanumeric & subliniere), +mean se potrivește cu 1 sau mai multe din jetonul precedent și întregul înțeles este selectați orice cuvânt care este end-up cu ly. Există doar două 2 cuvinte (‘cu atenție ‘și’ rapid’) care este îndeplinită expresia regulată de mai sus.

înainte de a muta în re.findall () sau re.finditer (), să vedem ce face re.căutare () medie în Python 2.* Documentație.

scanați prin șir căutând prima locație în care modelul de expresie regulată produce o potrivire și returnați o instanță MatchObject corespunzătoare. Returnați niciunul dacă nicio poziție din șir nu se potrivește cu modelul; rețineți că acest lucru este diferit de găsirea unui meci de lungime zero la un moment dat în șir.

următoarele linii de cod vă oferă de bază să înțeleagă de re.căutare ().

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

acesta va genera re.MatchObject de obiect de tip clasă care au 13 de metode și atribute acceptate în conformitate cu Python 2.* Documentație. Această metodă span () constă în punctele de început și sfârșit(7 și 16 prezente în exemplul de mai sus) ale cuvântului potrivit în variabila text. re.căutare () metoda ia în considerare numai despre primul meci, în caz contrar reveni None.

să trecem la întrebarea, înainte de a vedea ce face re.finditer () înseamnă în Python 2.* Documentație.

returnați un iterator care dă instanțe MatchObject peste toate potrivirile care nu se suprapun pentru modelul RE în șir. Șirul este scanat de la stânga la dreapta, iar potrivirile sunt returnate în ordinea găsită. Meciurile goale sunt incluse în rezultat.

venind linii de cod următoare vă oferă să înțeleagă de bază de re.finditer ().

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

exemplul de mai sus ne oferă obiectele Iterator care trebuie să fie buclă. Acest lucru nu este, evident, rezultatul pe care îl dorim. Să bucla finditer și să vedem ce se află în interiorul acestui obiecte Iterator.

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

aceste rezultate sunt mult similare cu re.căutare () rezultat pe care îl obținem mai devreme. Dar putem vedea noul rezultat în producția de mai sus, <re.Match object; span=(40, 47), match='quickly'>. Așa cum am menționat mai devreme în Python 2.* Documentație, re.căutare () va scana prin șir în căutarea pentru prima locație în care modelul de expresie regulată produce o potrivire și re.finditer () va scana prin șir în căutarea pentru toate locațiile în care modelul expresie regulată produce meciuri și a reveni mai multe detalii decât re.findall () metodă.

aici ce re.findall () înseamnă în Python 2.* Documentație.

returnați toate potrivirile care nu se suprapun ale modelului în șir, ca o listă de șiruri. Șirul este scanat de la stânga la dreapta, iar potrivirile sunt returnate în ordinea găsită. Dacă unul sau mai multe grupuri sunt prezente în model, returnați o listă de grupuri; aceasta va fi o listă de tupluri dacă modelul are mai multe grupuri. Meciurile goale sunt incluse în rezultat.

să înțelegem ce se întâmplă în re.findall ().

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

această ieșire ne oferă doar cuvintele potrivite în text variabilă, altfel returnați o listă goală. Această listă în ieșire, care este similar cu match atribut în re.MatchObject.

aici este codul complet și am încercat în 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()