2015-12-22 2 views
1

У меня есть группа строк timestamp. Каждая строка имеет три раздела и разделители между разделами. Разделителем может быть любой из этих [.:,;] Символов. Каждый раздел содержит цифры. Первый может содержать одну или две цифры. Любой другой раздел может содержать две цифры. Мне нужно получить эти цифры и выполнить некоторые действия с ними. Я использую Python3.Регулярное выражение Python, удалять повторяющийся класс

Итак, я пишу этот код:

import re 
lines = ('1:24.15', '17.01.01', '05:07:28', '175.11.123', '4:35,07', '01;21;73', '00;1;1', '7;7.12') 
pattern = re.compile(r'^(\d{1,2})[:.,;](\d{2})[:.,;](\d{2})$') 
for i in lines: 
    try: 
     mm, ss, ff = pattern.search(i).groups() 
    except AttributeError: 
     print('{} is invalid'.format(i)) 
    print(int(mm) * 60 + int(ss) + round(int(ff)/0.075/1000, 3)) 

Мой вопрос ... Как я мог уменьшить повторы в этом регулярном выражении?

r'^(\d{1,2})[:.,;](\d{2})[:.,;](\d{2})$' 

Заранее спасибо. Я буду благодарен за любой совет.

ответ

1

Почему бы не использовать re.split():

pattern = re.compile(r"[.:;,]") 
for line in lines: 
    mm, ss, ff = pattern.split(line) 

Хотя, это потребует дополнительной проверки длин mm, ss и ff. С одной стороны - это делает вещи менее привлекательными, но это приводит к более точным и значимым сообщениям об ошибках:

pattern = re.compile(r"[.:;,]") 
for line in lines: 
    try: 
     mm, ss, ff = pattern.split(line) 
    except ValueError: 
     print('{} has not enough digit groups'.format(line)) 
     continue 

    if len(mm) not in (1, 2) or len(ss) != 2 or len(ff) != 2: 
     print('{} has a digit group with invalid length'.format(line)) 
     continue 

    print(int(mm) * 60 + int(ss) + round(int(ff)/0.075/1000, 3)) 
+0

Красивая идея. Как насчет неверных строк? Мне нужно разобраться с ними ... –

+0

@AndreyMylnikov уверен, поймайте исключение «ValueError». – alecxe

+0

Боюсь, я не понимаю, как это сделать. Пример был бы замечательным ... :) –

0

r'^(\d{1,2})([:.,;](\d{2})){2}$'

Это должно быть столь же компактным, как это возможно.

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