2009-07-20 5 views
8

Souvent, je voudrais construire des expressions rationnelles complexes à partir d'expressions simples. La seule façon que je suis actuellement au courant de le faire est par le biais des opérations de chaîne, par exemple .:Regexp Composable en Python

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) 

Quelqu'un est-il au courant d'une autre méthode ou une approche plus systématique (peut-être un module) en Python pour avoir composables regexps? Je préfère compiler chaque regexp individuellement (par exemple pour utiliser des options de compilation individuelles), mais il ne semble pas y avoir moyen de les composer!?

+0

La façon dont vous le faites semble claire et concise. Oh, au fait, vous n'avez pas besoin du "r" dans la chaîne pour votre variable "Date". –

+0

Est-ce que Python autorise les commentaires dans les expressions régulières? –

+1

mmyers, oui. Lorsque vous utilisez le drapeau re.VERBOSE, vous pouvez utiliser # pour les commentaires. –

Répondre

1

Vous pouvez utiliser rxb de Ping:

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 

Vous pouvez alors faire correspondre la date résultante directement, ou utiliser

DateR = date.compile() 
+0

Cela ressemble à la réponse que je cherchais, merci. Je vais devoir vérifier comment le module va compiler les options et les groupes de correspondance, mais à première vue, il semble perferct :-). – ThomasH

4

Vous pouvez utiliser la syntaxe de formatage de Python pour cela:

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) 

(. Notez la valeur ajoutée de regroupement autour de Jan | février | Mar)

+0

Cela dépend toujours des opérations de cordes, non ?! – ThomasH

+1

Yep !? (/ * remplissage pour contourner le système de commentaire stupide * /) –