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

62lalag4  于 2022-12-02  发布在  Python
关注(0)|答案(4)|浏览(175)

在Python中,如何编写正则表达式来拆分段落?
一个段落由两个换行符(\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

g6baxovj

g6baxovj1#

不幸的是,没有一种好的方式来写“空格但不换行”。
我认为你能做的最好的事情就是用x修饰符添加一些空间,并尝试把丑陋的部分分解出来一点,但这是值得怀疑的:(?x) (?: [ \t\r\f\v]*? \n ){2} [ \t\r\f\v]*?
您也可以尝试仅为角色类创建子规则,并对其进行三次插值。

eit6fx6z

eit6fx6z2#

您可能尝试在普通测试中推导文档的结构,并执行docutils所做的操作。
您可以简单地使用Docutils解析器,而不必使用您自己的解析器。

ecfsfe2w

ecfsfe2w3#

它不是正则表达式,但确实很优雅:

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

vql8enpb

vql8enpb4#

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

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

相关问题