2014-04-26 9 views
2

Переменной content содержит многострочную строку:Python: Regex находит только часть искомой строки

content = """ 
/blog/1:text:Lorem ipsum dolor sit amet, consectetur ### don't need this 
<break> 
text:Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore 
<break> 
text:Excepteur sint occaecat cupidatat non proident. 

/blog/16:text:Other Lorem ipsum dolor ### SEEKING THIS!!! 
<break> 
text:Other, really other 
<break> 
text:Blah blah. 
""" 

Я пытаюсь найти нужное возникновение с рисунком /блог/16:

re.findall('^(?ism)%s?:(.*?)(\n\n)' % '/blog/16', content) 

и ожидая, чтобы получить эту

[(u'/blog/16:text:Other Lorem ipsum dolor ### SEEKING THIS!!! 
<break> 
text:Other, really other 
<break> 
text:Blah blah.', u'\n\n')] 

, но получить неверный результат (/блог/1)

[(u'/blog/1:text:Lorem ipsum dolor sit amet, consectetur ### don't need this 
<break> 
text:Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore 
<break> 
text:Excepteur sint occaecat cupidatat non proident.', u'\n\n')] 

Что моя ошибка?

+0

Непонятно. Каков шаблон, который вы ищете, и в чем проблема? – thefourtheye

+0

* В чем моя ошибка? *, ** Ans: ** Ваша ошибка: вы не разместили образец образца, который хотите совместить. –

+0

Извините за это, я ищу **/blog/16 **, но он находит **/blog/1 **. Обновлен вопрос. –

ответ

2

После вставки текста в блоге, это часть вашего регулярного выражения:

/blog/16?: 

Значения ": /blog/1 буквально, затем 6 буквально (ноль или один раз); . Затем : буквально»Вместо этого попробуйте:

(?ism)^/blog/16:(.*?)$ 

Это находит все /blog/16: буквально в начале строки, а затем делает нежадным поиск любых символов до конца строки (т.е. захватывает остальная часть текста на линии).

вы могли бы найти regex101 полезную для разработки и тестирования регулярных выражений.

+0

Спасибо за самый полезный ответ! –

2

Когда строка замена будет сделана, ваша строка выглядит следующим образом

^(?ism)/blog/16?:(.*?)(\n\n) 

Здесь ? средства, которые соответствуют предыдущему образцу 0 или 1 разы. Итак, когда вход /blog/1, он соответствует 0 раз и позволяет провести матч.

Действительное RegEx вы ищете,

import re 
print re.findall('(?ims)(/blog/16:.*)(?:/blog|$)', content) 

Выход

['/blog/16:text:Other Lorem ipsum dolor ### SEEKING THIS!!!\n<break>\ntext:Other, really other\n<break>\ntext:Blah blah.\n'] 
2

Я думаю, что вы забыли поставить, не захватив группу в скобках. в ?:. Прямо сейчас, ваш ? говорит «0 или 1 предыдущего элемента, «это означает, что 6 не является необходимым.

+0

Спасибо, я думал, что это связано со всем рисунком, а не с последним персонажем. –

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