python正则表达式来分割段落
题
如何编写一个在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的分段符
解决方案
不幸的是,没有很好的方法来编写“空格而不是换行符”。
我认为你能做的最好的事情就是用 x
修饰符添加一些空间并尝试稍微分解一下丑陋,但这是有问题的:(?x)(?:[ \ t \ r \ n \ f \ v] *?\ n){2} [\ t \ r \ t \ v] *?
您也可以尝试为字符类创建一个子规则并将其插值三次。
其他提示
您是否尝试在普通测试中推断出文档的结构?你在做什么 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*?
不隶属于 StackOverflow