2014-11-07 2 views
1

Моя строка выглядит следующим образом:регулярное выражение для извлечения секции

[abc] 
line_one xxxxxxxxxxxxxx 
line_two xxxxxxxxxxxxxx 
[pqr] 
line_four xxxxxxxxxxxxxx 
line_five xxxxxxxxxxxxxx 
[xyz] 
line_six xxxxxxxxxxxxxx 
line_seven xxxxxxxxxxxxxx 

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

result = re.compile(r'(\[.+\])') 
details = result.findall(string) 

с этим я получаю имена разделов, а затем я попытался:

result = re.compile(r'(\[.+\]((\n)(.+))+)') 

Любое предложение ??

ответ

1
(\[[^\]]*\][^\[]+)(?:\s|$) 

Try this.See demo.This предоставит вам раздел по разделам мудрым.

http://regex101.com/r/mP1wO4/1

import re 
p = re.compile(ur'(\[[^\]]*\][^\[]+)(?:\s|$)') 
test_str = u"[abc]\nline_one xxxxxxxxxxxxxx\nline_two xxxxxxxxxxxxxx\n[pqr]\nline_four xxxxxxxxxxxxxx\nline_five xxxxxxxxxxxxxx\n[xyz]\nline_six xxxxxxxxxxxxxx\nline_seven xxxxxxxxxxxxxx" 

re.findall(p, test_str) 
+1

Errr флаг DOTALL не нужен .... – Jerry

+0

hahahahahaha это было слишком быстро .. Отлично .. спасибо .. – mrutyunjay

+0

примет ваш ответ за 8 минут. :-) – mrutyunjay

1

Использование re.findall функции. Вы должны включить \n внутри положительного lookahead, так что он не будет символом новой строки, который присутствовал как раз перед блоком [].

>>> m = re.findall(r'(?s)(?:^|\n)(\[[^\]]*\].*?)(?=\n\[[^\]]*\]|$)', s) 
>>> m 
['[abc]\nline_one xxxxxxxxxxxxxx\nline_two xxxxxxxxxxxxxx', '[pqr]\nline_four xxxxxxxxxxxxxx\nline_five xxxxxxxxxxxxxx', '[xyz]\nline_six xxxxxxxxxxxxxx\nline_seven xxxxxxxxxxxxxx'] 
>>> for i in m: 
    print(i) 


[abc] 
line_one xxxxxxxxxxxxxx 
line_two xxxxxxxxxxxxxx 
[pqr] 
line_four xxxxxxxxxxxxxx 
line_five xxxxxxxxxxxxxx 
[xyz] 
line_six xxxxxxxxxxxxxx 
line_seven xxxxxxxxxxxxxx 
1

С расколом:

re.split(r'\n*(?=\[)', s) 

или

re.split(r'(?m)\n*^(?=\[)', s)