2009-07-20 2 views
8

Часто я хотел бы создавать сложные регулярные выражения из более простых. Единственный способ, которым я в настоящее время нахожусь в курсе делать это через строковые операции, например .:Composable Regexp in 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) 

Кто-нибудь знает о других методах или более системного подходе (возможно, модуль) в Python, чтобы иметь компонуемые регэксп? Я предпочел бы скомпилировать каждое регулярное выражение индивидуально (например, для использования отдельных параметров компиляции), но тогда, похоже, не существует способа их компоновки !?

+0

То, как вы это делаете, кажется ясным и кратким. О, кстати, вам не нужно «r» в строке для вашей переменной «Date». –

+0

Предоставляет ли Python комментарии в регулярных выражениях? –

+1

mmyers, да. Когда вы используете флаг re.VERBOSE, вы можете использовать # для комментариев. –

ответ

1

Вы можете использовать Пинг 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 

Затем вы можете напрямую сопоставить полученную дату или использовать

DateR = date.compile() 
+0

Это похоже на ответ, который я искал, спасибо. Мне нужно будет проверить, как модуль идет о параметрах компиляции и группах соответствия, но с первого взгляда он выглядит perferct :-). – ThomasH

4

Вы можете использовать синтаксис форматирования Python для этого:

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) 

(. Обратите внимание на добавленную группировку вокруг Янв | Фев | Мар)

+0

Это все еще зависит от строковых операций, правильно ?! – ThomasH

+1

Да !? (/ * дополнение для работы вокруг немой системы комментариев * /) –