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