Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
分割段落的python正则表达式_Python_Regex_Parsing_Text_Split - Fatal编程技术网

分割段落的python正则表达式

分割段落的python正则表达式,python,regex,parsing,text,split,Python,Regex,Parsing,Text,Split,如何编写一个正则表达式以在python中用于分割段落 段落由两个换行符(\n)定义。但是可以有任意数量的空格/制表符和换行符,它仍然应该被视为一个段落 我使用的是python,因此解决方案可以使用扩展的python。(可以使用(?P…)东西) 示例: 我能提供的最好的是: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\

如何编写一个正则表达式以在python中用于分割段落

段落由两个换行符(\n)定义。但是可以有任意数量的空格/制表符和换行符,它仍然应该被视为一个段落

我使用的是python,因此解决方案可以使用扩展的python。(可以使用
(?P…)
东西)

示例: 我能提供的最好的是:
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*?\n\s*?\n\s*?

您是否试图在普通测试中推断文档的结构?你在做什么


你可以简单地使用空格,而不是自己滚动。

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

我认为你能做的最好的事情就是用
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食谱”;-)

FYI:我刚刚在另一个线程中为这类问题编写了两个解决方案。首先使用此处要求的正则表达式,然后使用一种状态机方法,该方法一次通过一行输入:


这会使示例2失败,因为\s包含\n.Neat解决方案。什么是
str_isspace
?输入错误:-)您应该从对象字符串中读取str.isspace,其中包含方法isspace()。它将被调用以确定某物是否是一个空间,并将根据该空间对对象进行分组。我修好了。
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'