python正则表达式来分割段落

时间:2008-09-22 18:10:41

标签: python regex parsing text split

如何编写一个在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 s。

5 个答案:

答案 0 :(得分:4)

不幸的是,编写“空格而不是换行符”没有好办法。

我认为您可以做的最好的事情是使用x修饰符添加一些空格并尝试稍微分解一下丑陋,但这是有问题的:(?x) (?: [ \t\r\f\v]*? \n ){2} [ \t\r\f\v]*?

您也可以尝试为字符类创建一个子规则并将其插值三次。

答案 1 :(得分:2)

您是否尝试在普通测试中推断出文档的结构?你在做docutils做的事吗?

您可以简单地使用Docutils parser而不是自己动手。

答案 2 :(得分: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”的启发; - )

答案 3 :(得分:0)

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

\s*?\n\s*?\n\s*?

答案 4 :(得分:0)

仅供参考:我刚刚在另一个线程中针对此类问题写了2个解决方案。首先使用此处要求的正则表达式,然后使用状态机方法,该方法一次流经输入的每一行:

https://stackoverflow.com/a/64863601/5201675