2013-10-08 6 views
0

Я пытаюсь использовать регулярное выражение для определения данных формата: XX дней, XX часов, XX минут (ожидая минимальных структурных изменений из-за пробелов, запятых и множественных чисел) Я хотел видеть эффективный python для использования регулярного выражения, чтобы я мог получать числа, связанные с днями и минутами.Группы регулярных выражений в python

Я попытался следующий:

matchingTime = "27 days, 21 hours, 23 minutes ago" 
re.search('([0-9]{0,2}).*day.* ([0-9]+) .*hour.* ([0-9]+) .*minute.*',matchingTime) 

Для вышеописанного случая он отлично работает, и я получаю значение в группе-2-соответственно.

вопрос либо поля не обязательно может присутствовать, скажем

matchingTime = "21 hours, 23 minutes ago" 

для вышеприведенного случая он терпит неудачу.

Я знаю, что могу сделать это с помощью проб и исключений, но я надеялся найти краткий и эффективный способ сделать это.

Любые входы будут действительно полезными. Буду рад дать какие-либо дополнительные разъяснения по моему запросу.

EDIT: [0-9]{0,2} для части дней, просто попробуйте несколько способов решить эту проблему.

+1

Просто поместите не захватные парсеры тогда? вокруг необязательной части ''(:? ([0-9] {0,2}). * день. *)? ([0-9] +). * час. * ([0-9] +). * минута. * '' – Gene

+1

Вы хотите, чтобы дополнительные группы смотрели [необязательная группа захвата python regex] (http://stackoverflow.com/questions/15474741/python-regex-optional-capture-group) – Rod

ответ

2

Вы могли бы, возможно, использовать регулярные выражения, как:

(?:(?P<days>[0-9]{0,2})\s*day[^, ]*,? *)?(?:(?P<hrs>[0-9]+)\s*hour[^, ]*,? *)?(?:(?P<min>[0-9]+)\s*minute[^, ]*,? *)? 

regex101 demo

Я использую [^, ]*,? * для опциональных запятых и пробелов, а не с помощью .* просто так там не слишком много возвратов.

Я также использовал именованные группы захвата и обернул целые группы за каждый день/час/минуту в группу без захвата, после чего я положил ?, чтобы пометить их как необязательные. Каждая группа довольно похожа:

(?:      # Start of non-capture group 
    (?P<days>[0-9]{0,2}) # Numbers to capture 
    \s*     # Spaces if any 
    day     # Literal match 
    [^, ]*,? *   # Anything until first comma and optional spaces 
)?      # Close of non-capture group and marking it as optional 
+0

скобки несбалансированный. – falsetru

+0

Итак, я получаю доступ к результату в группе 1 2 3? –

+0

@AjayNair Аналогично тому, что у вас есть, за исключением того, что вы используете имя захвата как строку. Объект соответствия с '.group ('days')' for days, '.group ('hrs')' в течение нескольких часов и т. Д. – Jerry

Смежные вопросы