Come posso trovare tutte le corrispondenze a un'espressione regolare in Python?


312

In un programma che sto scrivendo, ho Python che usa la re.search()funzione per trovare corrispondenze in un blocco di testo e stampare i risultati. Tuttavia, il programma termina quando trova la prima corrispondenza nel blocco di testo.

Come posso farlo ripetutamente se il programma non si ferma fino a quando TUTTE le partite non sono state trovate? C'è una funzione separata per fare questo?


Le RE ricorsive sono una bestia diversa. Vuoi ripetere la ricerca.
esce il

Risposte:


546

Usa re.findallo re.finditerinvece.

re.findall(pattern, string) restituisce un elenco di stringhe corrispondenti.

re.finditer(pattern, string)restituisce un iteratore sugli MatchObjectoggetti.

Esempio:

re.findall( r'all (.*?) are', 'all cats are smarter than dogs, all dogs are dumber than cats')
# Output: ['cats', 'dogs']

[x.group() for x in re.finditer( r'all (.*?) are', 'all cats are smarter than dogs, all dogs are dumber than cats')]
# Output: ['all cats are', 'all dogs are']

18
finditerera quello che stavo cercando. Sono sorpreso che uno restituisca gli oggetti Match e le altre stringhe. Mi aspettavo di usare una match_allo match_iterfunzione.
chiudere il

21
NOTA BENE: quelli troveranno solo partite non sovrapposte
Antoine Lizée,

3
@ AntoineLizée, come si trovano le iterazioni CON la sovrapposizione?
Raksha,

16
@Raksha: utilizzare re.searchin un ciclo. Restituirà un Matchoggetto. Ti consigliamo di passare Match.start() + 1come posargomento re.searchper la prossima iterazione del ciclo.
ArtOfWarfare

3
Se la corrispondenza contiene più di un gruppo, findallverrà restituito un elenco di tuple corrispondenti, non un elenco di stringhe corrispondenti.
Rodorgas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.