2016-04-12 16 views
1

Neden düzenli olarak çalışmamın nedenini merak ediyorum. Çalıştığı tek grup yıl. Grupların geri kalanları Yoktur. regex yazılır may 1991 Regex gruptaki grupla çalışmaz

  • 10 may 1991
  • :

    formatted_date = re.search('.*((?P<day>\d{1,2}))?((?P<month>[a-zA-Z]+))?(?P<year>\d{4}).*', '10 may 1991') 
    

    regex arkasındaki fikir şu girişi üzerinde çalışacak olmasıdır Python'da. diğer için barındıracak şekilde verim neler peşin :)

+0

Başlangıçta nokta ile tembel eşleştirmeyi kullanın: '. *?', Ancak buna ihtiyacınız olduğunu düşünmüyorum. –

+0

Teşekkür ederiz Wiktor !!! Tembel eşleşmeyi asla unutmayacağım – Miriam

cevap

2

konu içinde

Teşekkür sonra desen başında açgözlü nokta eşleştirme altmodel sonuna kadar tüm karakterleri kapmak olması ve verimli geri adım attığı alt şablonlar. İlk 2 isteğe bağlı olduğundan, onlara bir metin verilmez.

.*'un re.search'a tam bir dizgi eşleşmesi gerektirmesine gerek yoktur.

Kullanım

(?:(?P<day>\d{1,2}))?(?:(?P<month>[a-zA-Z]+))?(?P<year>\d{4}) 

maç nesne biraz daha temiz böylece ayrıca sigara yakalama için isteğe bağlı gruplar yakalayan dönüştürülen regex demo

bakınız.

Yaklaşımınızı kullanmaya devam ederseniz, desenin başlangıcında .*? kullanmayı düşünebilirsiniz (tembel nokta eşleşmesi) ancak yeni satırlar hakkında endişelenmeniz gerekir (Tamam, bunu çözmek için re.S bayrağını kullanabilirsiniz) bir) ve bu şekilde, dizenizdeki tarihin ilk örneğini elde edersiniz. Birden fazlasına sahipseniz ve sonuncuyu almanız gerekiyorsa, en iyi yaklaşım, önerdiğim modelle re.findall'u kullanmak ve sonuçta oluşan listenin son elemanını almaktır.

+1

Çok teşekkürler! Regex şimdi bana çok daha mantıklı geliyor. En iyi cevap, umarım :) – Miriam