2008-09-22 183 views
5

如何寫一個正則表達式在python中使用來拆分段落?Python正則表達式拆分段落

段落由2個換行符(\ n)定義。但是可以將任意數量的空格/製表符與換行符一起使用,並且仍然應該將其視爲段落。

我正在使用Python,所以解決方案可以使用python的regular expression syntax這是擴展。 (可利用(?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) 

但是這是醜陋的。有什麼更好的?

編輯

建議拒絕:

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包括\ n。 – 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