python正则表达式拆分段落
时间:2020-03-06 14:33:15 来源:igfitidea点击:
一个人怎么写一个正则表达式来在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] *', IE
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。
解决方案
几乎相同,但使用非贪婪量词并利用空白序列。
\s*?\n\s*?\n\s*?
我们是否在尝试通过简单测试来推断文档的结构?你在做什么docutils吗?
我们也许可以简单地使用Docutils解析器,而不用自己动手。
不幸的是,没有一种很好的方式来写"空格而不是换行符"。
我认为我们最好的办法是使用x修饰符添加一些空间,并尝试消除难看的地方,但这是有问题的:(?x)(?:[\ t \ r \ f \ v] * ?\ n){2} [\ t \ r \ f \ v] *?
我们也可以尝试仅为该字符类创建一个子规则,并将其内插三遍。
不是正则表达式,但非常优雅:
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" ;-)

