2010-05-10 28 views
18

Bir dizgede basit bir örüntünün son oluşumunu eşleştirmek için wanto, örn. dize çok uzunsaPython düzenli ifadesiyle son maçı bul

list = re.findall(r"\w+ AAAA \w+", "foo bar AAAA foo2 AAAA bar2") 
print "last match: ", list[len(list)-1] 

Ancak, eşleşmelerin devasa bir liste oluşturulur. "AAAA" nın ikinci durumunu eşleştirmek için daha doğrudan bir yol var mı yoksa bu geçici çözümü mi kullanmalıyım? built-in gölgeler olarak tip Ayrıca

>>> s = """foo bar AAAA 
foo2 AAAA bar2""" 
>>> re.findall(r"\w+ AAAA \w+$", s) 
['foo2 AAAA bar2'] 

, list sizin değişken için kötü bir isim olduğuna dikkat:

+6

Dizgiyi tersine çevirmek için başka bir seçenek de ('mystr [:: - 1]') tersine çevrilebilir. – ChristopheD

+2

@ChristopheD, Gross! Bir regex'ten anlamak için daha zor olan bir şey geriye doğrudur. – mlissner

cevap

24

çizgi karakterin sonunu gösterir $ kullanabilirsiniz. Sonra

for match in re.finditer(r"\w+ AAAA \w+", "foo bar AAAA foo2 AAAA bar2"): 
    pass 

:

>>> lst = [2, 3, 4] 
>>> lst[-1] 
4 
+0

Çok satırlı bir dizeyle karşılaşırsam ne olur? – SDD

+1

@SDD: hala iyi çalışıyor – SilentGhost

+3

Böyle bir giriş dizesi için çalışmaz: "foo bar AAAA foo2 AAAA bar2 bar3". Elbette, böyle bir vakanın mümkün olup olmadığını bilmiyoruz, yeterli bilgiye sahip değiliz. – tzot

22

Sadece tüm maçları yineleme ve son maçını tutarak bir liste bina önleyebilirsiniz: Bir listenin son öğe erişmek için sadece [-1] endeksi kullanabilirsiniz Bu, match son maçı tutar ve desen ve aranan dize tüm birleşimleri için çalışır. İlk olarak match değerini None olarak ayarlamak isteyebilirsiniz, çünkü eşleşme yoksa match hiçbir değere ayarlanmayacaktır.

+0

Bu, birçok kullanım kılavuzunda çok kullanışlıdır. Genellikle bir örüntüün tüm oluşumlarını değiştirmek istersiniz, daha sonra giriş dizesinin son kısmını özel olarak işleyin. –