Bagaimana saya bisa menemukan semua kecocokan dengan ekspresi reguler di Python?

312

Dalam sebuah program yang saya tulis saya punya Python menggunakan re.search()fungsi untuk menemukan kecocokan dalam blok teks dan mencetak hasilnya. Namun, program keluar setelah menemukan kecocokan pertama di blok teks.

Bagaimana saya melakukan ini berulang kali ketika program tidak berhenti sampai SEMUA kecocokan ditemukan? Apakah ada fungsi terpisah untuk melakukan ini?

kjakeb
sumber
RE rekursif adalah binatang yang berbeda. Anda ingin mengulangi pencarian.
outis

Jawaban:

546

Gunakan re.findallatau re.finditersebagai gantinya.

re.findall(pattern, string) mengembalikan daftar string yang cocok.

re.finditer(pattern, string)mengembalikan iterator di atas MatchObjectobjek.

Contoh:

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']
Amber
sumber
18
finditeradalah apa yang saya cari. Saya terkejut bahwa satu mengembalikan objek Match dan string lainnya. Saya mengharapkan untuk menggunakan match_allatau match_iterfungsi.
dsclose
21
PENOLAKAN: mereka hanya akan menemukan pertandingan yang tidak tumpang tindih
Antoine Lizée
3
@ AntoineLizée, bagaimana orang menemukan iterasi DENGAN tumpang tindih?
Raksha
16
@Raksha - Gunakan re.searchdalam satu lingkaran. Ini akan mengembalikan Matchobjek. Anda ingin meneruskan Match.start() + 1sebagai posargumen untuk re.searchiterasi loop berikutnya.
ArtOfWarfare
3
Jika pertandingan berisi lebih dari satu grup, findallakan mengembalikan daftar tupel yang cocok, bukan daftar string yang cocok.
rodorgas