繁体   English   中英

Python正则表达式拆分段落

[英]Python regular expression to split paragraphs

如何编写在 Python 中使用的正则表达式来拆分段落?

一个段落由两个换行符 (\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]*' ,即

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。

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

我认为你能做的最好的事情就是用x修饰符添加一些空间并尝试稍微排除丑陋,但这是有问题的: (?x) (?: [ \t\r\f\v]*? \n ){2} [ \t\r\f\v]*?

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

您可能试图在 plain test 中推断文档的结构并执行docutils所做的事情。

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

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

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

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

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

一个人将如何编写一个正则表达式以在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]*' ,即

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的段落分隔符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM