2015-03-18 3 views
1

У меня есть строка, как этотPython регулярное выражение уловах группы

string = "2014 Blah - Blah Blah Blah Blah-Blah Blah" 

Я хочу, чтобы ловить группы как этот
(2014) (Бла) - (Бла) (Бла Бла Бла-Бла Бла) I пытался сделать это этим кодом

pattern = "([0-9]{4})(.*)-(\w*)\s(.*)" 
search_result = re.search(r'%s'%pattern,string,re.M|re.I) 
if search_result: 
    print search_result.groups() 
else: 
    print "Nothing matched" 

Но она возвращается

('2014', ' Blah - Blah Blah Blah Blah', 'Blah', 'Blah') 

Где я ошибаюсь?

ответ

0

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

      v--- Change it to `.*?` 
pattern = "([0-9]{4})(.*)-(\w*)\s(.*)" 
         ^-- greedy you have to add `?` to make it ungreedy 

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

(\d*)\s(.*?)\s-\s(.*?)\s(.*) 

Working demo

enter image description here

Match информация

MATCH 1 
1. [0-4] `2014` 
2. [4-10] `Blah` 
3. [12-16] `Blah` 
4. [17-41] `Blah Blah Blah-Blah Blah` 
+0

Это работает для меня, но, возможно, я знаю, что ты жадный и ungreedy на самом деле? –

+0

@Goutam Вы можете проверить очень хорошее ** [документация здесь] (http://www.regular-expressions.info/repeat.html) ** о жадности. Вкратце, если у вас есть строка 'abcxxxc', и вы используете это жадное выражение' a. * C', вы будете сопоставлять 'abcxxxc', но если вы используете невращающийся (или ленивый) quatifier, как этот' a. *? C', то вы будете соответствовать 'abc'. Жадность будет соответствовать как можно большему и нескромному как можно меньше. –

0

Сделать первую группу не жадный:

pattern = "([0-9]{4})(.*?)\s*-\s*(\w*)\s(.*)" 

или

pattern = "([0-9]{4})([^-]+)\s*-\s*(\w*)\s(.*)" 
Смежные вопросы