Python'da normal bir ifadeyle tüm eşleşmeleri nasıl bulabilirim?


312

Yazdığım bir programda re.search(), bir metin bloğundaki eşleşmeleri bulmak ve sonuçları yazdırmak için Python işlevini kullanıyorum . Ancak, metin bloğundaki ilk eşleşmeyi bulduğunda programdan çıkılır.

TÜM eşleşmeler bulunana kadar programın durmadığı yerlerde bunu tekrar tekrar nasıl yapabilirim? Bunu yapmak için ayrı bir işlev var mı?


Özyinelemeli RE'ler farklı bir canavardır. Aramayı tekrarlamak istiyorsunuz.
outis

Yanıtlar:


545

Kullanın re.findallveya re.finditerbunun yerine.

re.findall(pattern, string) eşleşen dizelerin bir listesini döndürür.

re.finditer(pattern, string)MatchObjectnesneler üzerinde bir yineleyici döndürür .

Misal:

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
finditeraradığım şey buydu. Birinin Match nesnelerini ve diğer dizeleri döndürdüğüne şaşırdım. Bir match_allveya match_iterişlev kullanmayı bekliyordum .
dsclose

21
YASAL UYARI: sadece örtüşmeyen maçlar bulacaksınız
Antoine Lizée

3
@ AntoineLizée, üst üste binen yinelemeleri nasıl bulur?
Raksha

16
@Raksha - re.searchBir döngüde kullanın . Bir Matchnesne döndürür . Döngünün bir sonraki yinelemesi için argüman Match.start() + 1olarak geçmek isteyeceksiniz . posre.search
ArtOfWarfare

3
Eşleşme birden fazla grup içeriyorsa findall, eşleşen dizelerin listesini döndürür, eşleşen dizelerin listesini döndürmez.
rodorgas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.