Comportamento diverso tra re.finditer e ri.findall

Ottengo questo esempio dalle operazioni di espressione regolare in Python 2.* Documentazione e quell’esempio ben descritto qui in dettaglio con qualche modifica. Per spiegare tutta l’esempio, andiamo stringa variabile di tipo call,

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

e la compilazione tipo di modello di espressione regolare come,

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

\w media corrisponde a qualsiasi carattere alfanumerico (alfanumerico & carattere di sottolineatura), + media corrisponde a 1 o più dei precedenti e il token per l’intero significato è selezionare qualsiasi parola che si concludono con ly. Ci sono solo due parole 2 (‘attentamente ‘e’ rapidamente’) che sono soddisfatte dell’espressione regolare sopra.

Prima di passare in re.findall () o ri.finditer (), vediamo cosa fa ri.search () significa in Python 2.* Documentazione.

Scansiona la stringa cercando la prima posizione in cui il modello di espressione regolare produce una corrispondenza e restituisce un’istanza MatchObject corrispondente. Restituisce None se nessuna posizione nella stringa corrisponde al modello; si noti che questo è diverso dal trovare una corrispondenza di lunghezza zero ad un certo punto della stringa.

Seguenti righe di codice ti dà la base capire di re.ricerca().

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

Genererà re.MatchObject di tipo di classe oggetto che hanno 13 di metodi e attributi supportati secondo Python 2.* Documentazione. Questo metodo span () consiste con i punti iniziale e finale (7 e 16 presenti nell’esempio precedente) della parola corrispondente nella variabile text. ri.il metodo search () considera solo la prima corrispondenza, altrimenti restituisce None.

Passiamo alla domanda, prima di vedere cosa fa re.finditer () significa in Python 2.* Documentazione.

Restituisce un iteratore che produce istanze MatchObject su tutte le corrispondenze non sovrapposte per il pattern RE in string. La stringa viene scansionata da sinistra a destra e le corrispondenze vengono restituite nell’ordine trovato. Le partite vuote sono incluse nel risultato.

Venendo linee di codice successivo ti dà la base capire di re.finditer().

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

L’esempio sopra ci fornisce gli oggetti Iteratori che devono essere loop. Questo ovviamente non è il risultato che vogliamo. Facciamo un ciclo finditer e vediamo cosa c’è dentro questo Oggetto Iteratore.

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

Questo risultato è molto simile al re.search () risultato che otteniamo in precedenza. Ma possiamo vedere il nuovo risultato in uscita sopra, <re.Match object; span=(40, 47), match='quickly'>. Come ho già detto in precedenza in Python 2.* Documentazione, ri.search () esegue la scansione attraverso la stringa alla ricerca della prima posizione in cui il modello di espressione regolare produce una corrispondenza e ri.finditer () esegue la scansione attraverso la stringa alla ricerca di tutte le posizioni in cui il modello di espressione regolare produce corrispondenze e restituisce più dettagli di re.metodo findall ().

Qui cosa significa ri.findall () significa in Python 2.* Documentazione.

Restituisce tutte le corrispondenze non sovrapposte di pattern in string, come un elenco di stringhe. La stringa viene scansionata da sinistra a destra e le corrispondenze vengono restituite nell’ordine trovato. Se uno o più gruppi sono presenti nel modello, restituire un elenco di gruppi; questo sarà un elenco di tuple se il modello ha più di un gruppo. Le partite vuote sono incluse nel risultato.

Capiamo cosa succede in re.findall ().

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

Questo output ci dà solo le parole corrispondenti nella variabile text, altrimenti restituisce una lista vuota. Tale elenco nell’output che è simile all’attributo match in re.MatchObject.

Ecco il codice completo e ho provato 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()