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