用于拆分段落的python正则表达式

2024-05-15 17:29:27 发布

您现在位置: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\ns的段落打断


Tags: there示例数量定义段落空格p2
3条回答

不幸的是,没有好的方法来写“空格但不是换行符”。

我想你最好用x修饰符加一些空格,试着把丑陋因素考虑一下,但这是有问题的:(?x) (?: [ \t\r\f\v]*? \n ){2} [ \t\r\f\v]*?

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

不是regexp而是非常优雅:

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食谱”;-)

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

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

相关问题 更多 >