2015-06-06 3 views
3

Я хотел бы сопоставить следующие строки с использованием python regex и извлечь числа.Python regex for diffstat output

1 file changed, 1 insertion(+), 1 deletion(-) 
2 files changed, 10 insertions(+), 10 deletions(-) 
1 file changed, 1 insertion(+) 
1 file changed, 2 deletions(-) 

Так что, хотя я использую названные группы в регулярном выражении python и просматриваю шаблоны. Но это работает не так, как ожидалось.

#!/usr/bin/python 
import re 
pat='\s*(\d+).*changed,\s+(\d*)(?P<in>=\s+insertion).*(\d+)(?P<del>=\s+deletion.*') 
diff_stats = re.compile(pat) 
obj = diff_stats.match(line) 

ответ

1

Удалить = из названной группы захвата .. Также .. ваша последняя группа не закрыта!

\s*(\d+).*changed,\s+(\d*)(?P<in>\s+insertion).*(\d+)(?P<del>\s+deletion).* 
           ↑       ↑   ↑ 

См DEMO

Edit: Улучшенное регулярное выражение для + и - тоже и назвал захват цифр:

\s*(\d+)\s+files?\s+changed,\s*((?P<in>\d+)\s*(insertions?)\([+-]\))?,?\s*((?P<del>\d+)\s*(deletions?)\([+-]\))? 

См DEMO

+0

Да, но оно соответствует только первые две строки. «вставка» и «удаление» или необязательная. Либо один придет, либо и то, и другое. Так вы можете предложить шаблон для этого? – Dinesh

+0

@ Dinesh проверить обновление ... –

+0

Спасибо. Это сработало. :) P.S + всегда сопровождаются вставками. и - всегда следует удаление. Поэтому [+ -] может не потребоваться в шаблоне. – Dinesh

1

Вы должны необходимо добавить конец линейный якорь. Так что вы получите полное совпадение. А также вам нужно сделать некоторые детали как необязательные.

^\s*(\d+).*\bchanged,\s+(?:(\d*)(?P<in>\s+insertion).*?)?(?:(\d+)(?P<del>\s+deletion.*))?$ 

DEMO

+0

Спасибо. Он соответствует всем строкам. Но я хотел получить количество вставок и исключений. Если я попробую 'obj.group ('in')' он не печатает номер, вместо этого он печатает _insertion_. – Dinesh

+0

@ Dinesh, каков ваш ожидаемый результат для приведенного выше примера? –

+0

Я хотел извлечь цифры. Количество измененных файлов, количество вставок и количество удалений. – Dinesh