2009-07-20 19 views
8

Genellikle, basit olanlardan karmaşık düzenli ifadeler oluşturmak isterim. Şu anda bunu yapmanın farkındayım tek yolu, dize işlemleri geçer ör .:Python'da Bileşilebilir Regexp

Year = r'[12]\d{3}' 
Month = r'Jan|Feb|Mar' 
Day = r'\d{2}' 
HourMins = r'\d{2}:\d{2}' 

Date = r'%s %s, %s, %s' % (Month, Day, Year, HourMins) 
DateR = re.compile(Date) 

farklı bir yöntemle veya composable İfadelerinin olması Python bir daha sistematik bir yaklaşım (belki bir modülü) farkında biri var mı? Her regexp'i ayrı ayrı derlemeyi tercih ederim (örneğin, bireysel derleme seçeneklerini kullanmak için), ancak artık onları bir araya getirmenin bir yolu yok gibi görünüyor !?

+0

Yaptığınız şey net ve özlü görünüyor. Oh, bu arada, 'Tarih 'değişkeniniz için dizede" r "ye ihtiyacınız yoktur. –

+0

Python ifadelerde yorumlara izin veriyor mu? –

+1

mmyers, evet. Bayrak re.VERBOSE kullandığınızda, yorumlar için # kullanabilirsiniz. –

cevap

1

Şunları kullanabilirsiniz Ping en rxb:

year = member("1", "2") + digit*3 
month = either("Jan", "Feb", "Mar") 
day = digit*2 
hour_mins = digit*2 + ":" + digit*2 

date = month + " " + day + ", " + year + ", " + hour_mins 

Daha sonra, sonuçta ortaya çıkan tarihle eşleşebilir veya

'yı kullanabilirsiniz.
+0

Aradığım cevap gibi görünüyor, teşekkürler. Modülün derleme seçenekleri ve eşleme grupları hakkında nasıl gittiğini kontrol etmem gerekecek, ancak ilk görüşten itibaren perferct :-) görünüyor. – ThomasH

4

Bunun için Python'un biçimlendirme sözdizimi kullanabilirsiniz:

types = { 
    "year":   r'[12]\d{3}', 
    "month":  r'(Jan|Feb|Mar)', 
    "day":   r'\d{2}', 
    "hourmins": r'\d{2}:\d{2}', 
} 
import re 
Date = r'%(month)s %(day)s, %(year)s, %(hourmins)s' % types 
DateR = re.compile(Date) 

(. Eklendi Jan etrafında gruplama Not | Feb | Mar)

+0

Bu hala string işlemlerine dayanıyor, değil mi ?! – ThomasH

+1

Evet !? (/ * dilsiz yorum sistemi etrafında çalışmak için doldurma * /) –