2008-09-22 10 views
5

Как написать регулярное выражение для использования в python для разделения абзацев?регулярное выражение python для разделения абзацев

Абзац определяется двумя линиями (\ n). Но можно иметь любое количество пробелов/вкладок вместе с разрывами строк, и это все равно следует рассматривать как абзац.

Я использую python, поэтому решение может использовать расширение p. (Можно использовать (?P...) материал)

Примеры:

the_str = 'paragraph1\n\nparagraph2' 
# splitting should yield ['paragraph1', 'paragraph2'] 

the_str = 'p1\n\t\np2\t\n\tstill p2\t \n  \n\tp3' 
# should yield ['p1', 'p2\t\n\tstill p2', 'p3'] 

the_str = 'p1\n\n\n\tp2' 
# should yield ['p1', '\n\tp2'] 

Лучшее, что я мог бы прийти с является: r'[ \t\r\f\v]*\n[ \t\r\f\v]*\n[ \t\r\f\v]*', т.е.

import re 
paragraphs = re.split(r'[ \t\r\f\v]*\n[ \t\r\f\v]*\n[ \t\r\f\v]*', the_str) 

но это некрасиво. Что-нибудь лучше?

EDIT:

Предложения отвергнуто:

r'\s*?\n\s*?\n\s*?' -> Что бы пример 2 и 3 не получится, так как \s включает \n, так что это позволит абзацев с более чем 2 \n с.

ответ

4

К сожалению нет хорошего способа написать «пробел, но не символ новой строки».

Я думаю, что лучшее, что вы можете сделать, это добавить некоторое пространство с модификатором x и попытаться вынесет уродство немного, но это сомнительно: (?x) (?: [ \t\r\f\v]*? \n){2} [ \t\r\f\v]*?

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

+2

Существует. [^ \ S \ n] :) – 2009-03-05 12:21:29

0

Почти то же самое, но использование неживых кванторов и использование пробельной последовательности.

\s*?\n\s*?\n\s*? 
+0

что бы пример 2 терпит неудачу, потому что \ S включает в себя \ п. – nosklo 2008-09-22 18:25:53

2

Вы пытаетесь вывести структуру документа в обычном тесте? Вы делаете то, что делает docutils?

Возможно, вы сможете просто использовать Docutils parser, а не рулон самостоятельно.

1

Не регулярное выражение, но на самом деле элегантна:

from itertools import groupby 

def paragraph(lines) : 
    for group_separator, line_iteration in groupby(lines.splitlines(True), key = str.isspace) : 
     if not group_separator : 
      yield ''.join(line_iteration) 

for p in paragraph('p1\n\t\np2\t\n\tstill p2\t \n  \n\tp'): 
    print repr(p) 

'p1\n' 
'p2\t\n\tstill p2\t \n' 
'\tp3' 

Это до вас, чтобы лишить выход, как вам это нужно, конечно.

Вдохновленные из знаменитого "Python Cookbook" ;-)

+0

Удобное решение. Что такое `str_isspace`? – 2011-11-01 18:12:14

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

  • Нет связанных вопросов^_^