python正则表达式拆分段落

时间:2020-03-06 14:33:15  来源:igfitidea点击:

一个人怎么写一个正则表达式来在python中分割段落?

段落由2个换行符(\ n)定义。但是一个人可以有任意数量的空格/制表符以及换行符,并且仍然应将其视为一个段落。

我使用的是python,因此解决方案可以使用扩展的python正则表达式语法。 (可以使用(?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] *', IE

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。

解决方案

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

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

我们是否在尝试通过简单测试来推断文档的结构?你在做什么docutils吗?

我们也许可以简单地使用Docutils解析器,而不用自己动手。

不幸的是,没有一种很好的方式来写"空格而不是换行符"。

我认为我们最好的办法是使用x修饰符添加一些空间,并尝试消除难看的地方,但这是有问题的:(?x)(?:[\ t \ r \ f \ v] * ?\ n){2} [\ t \ r \ f \ v] *?

我们也可以尝试仅为该字符类创建一个子规则,并将其内插三遍。

不是正则表达式,但非常优雅:

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" ;-)