Python正则表达式拆分段落

问题描述:

如何写一个正则表达式在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秒。

不幸的是,没有很好的方式来写“空间而不是换行符”。

我认为你能做的最好的就是添加一些空间与x修改,并尝试以分解出丑了一点,但是这是有问题的:(?x) (?: [ \t\r\f\v]*? \n){2} [ \t\r\f\v]*?

你也可以尝试只为字符类创建一个子规则并插入它三次。

+2

有。 [^ \ S \ n] :) – 2009-03-05 12:21:29

几乎相同,但使用非贪婪量词并利用空格序列。

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

这将使示例2失败,因为\ s包括\ n。 – nosklo 2008-09-22 18:25:53

您是否试图在普通测试中推导出文档的结构?你在做什么docutils呢?

你或许可以简单地使用Docutils parser而不是自己推出。

不是一个正则表达式,但真的很优雅:

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