分割段落的python正则表达式
如何编写一个正则表达式以在python中用于分割段落 段落由两个换行符(\n)定义。但是可以有任意数量的空格/制表符和换行符,它仍然应该被视为一个段落 我使用的是python,因此解决方案可以使用扩展的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\
(?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'