forskellig adfærd mellem re.finditer og re.findall
jeg får dette eksempel fra regulære udtryk operationer i Python 2.* Dokumentation og det eksempel, der er godt beskrevet her i detaljer med en vis ændring. For at forklare hele eksempel, lad os få strengtype variabel opkald,
text = "He was carefully disguised but captured quickly by police."
og kompileringstypen regulært udtryk mønster som,
regEX = r"\w+ly"pattern = re.compile(regEX)
\w
middelværdi matcher ethvert ordtegn (alfanumerisk & understregning), +
middelværdi matcher 1 eller flere af det foregående token, og hele betydningen er at vælge et hvilket som helst ord, der ender med ly
. Der er kun to 2 ord (‘omhyggeligt ‘og’ hurtigt’), som er opfyldt ovenstående regulære udtryk.
før du flytter ind i re.findall () eller re.finditer (), lad os se, hvad der gør re.søg () betyder i Python 2.* Dokumentation.
Scan gennem streng på udkig efter den første placering, hvor det regulære udtryksmønster producerer en match, og returner en tilsvarende MatchObject-forekomst. Returner Ingen, hvis ingen position i strengen matcher mønsteret; bemærk, at dette adskiller sig fra at finde en null-længde match på et tidspunkt i strengen.
følgende kodelinjer giver dig den grundlæggende forståelse af re.søge().
search = pattern.search(text)print(search)print(type(search))#output<re.Match object; span=(7, 16), match='carefully'><class 're.Match'>
det vil generere re.MatchObject af klasse type objekt, som har 13 af understøttede metoder og attributter i henhold til Python 2.* Dokumentation. Denne span () – metode består af start-og slutpunkterne(7 og 16 til stede i ovenstående eksempel) af det matchede ord i text
variabel. re.søg () metode kun overveje om den allerførste kamp, ellers returnere None
.
lad os gå ind i spørgsmålet, før det se hvad der gør re.finditer () betyder i Python 2.* Dokumentation.
returner en iterator, der giver MatchObject-forekomster over alle ikke-overlappende kampe for RE-mønsteret i streng. Strengen scannes fra venstre mod højre, og kampe returneres i den fundne rækkefølge. Tomme kampe er inkluderet i resultatet.
kommer næste kode linjer giver dig den grundlæggende forståelse af re.finditer().
finditer = pattern.finditer(text)print(finditer)print(type(finditer))#output<callable_iterator object at 0x040BB690><class 'callable_iterator'>
ovenstående eksempel giver os Iteratorobjekterne, der skal sløjfes. Dette er naturligvis ikke det resultat, vi ønsker. Lad os loop finditer
og se, hvad der er inde i denne Iterator objekter.
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'>
disse resultater ligner meget re.søg () resultat, som vi får tidligere. Men vi kan se det nye resultat i ovenstående output, <re.Match object; span=(40, 47), match='quickly'>
. Som jeg nævnte tidligere i Python 2.* Dokumentation, re.Søg () vil scanne gennem streng på udkig efter den første placering, hvor regulære udtryk mønster producerer en kamp og re.finditer () vil scanne gennem streng på udkig efter alle de steder, hvor regulære udtryk mønster producerer kampe og returnere flere detaljer end re.findall () metode.
her hvad betyder re.findall () betyder i Python 2.* Dokumentation.
returner alle ikke-overlappende matches af mønster i streng som en liste over strenge. Strengen scannes fra venstre mod højre, og kampe returneres i den fundne rækkefølge. Hvis en eller flere grupper er til stede i mønsteret, skal du returnere en liste over grupper; dette vil være en liste over tupler, hvis mønsteret har mere end en gruppe. Tomme kampe er inkluderet i resultatet.
lad os forstå, hvad der sker i re.findall ().
findall = pattern.findall(text)print(findall)print(type(findall))#output<class 'list'>
denne udgang giver os kun de matchede ord i text
variabel, ellers returnerer en tom liste. Den liste i output, der ligner match
attributten i re.MatchObject.
her er den fulde kode, og jeg prøvede 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()