Python正则表达式拆分段落
问题描述:
如何写一个正则表达式在python中使用来拆分段落?Python正则表达式拆分段落
段落由2个换行符(\ n)定义。但是可以将任意数量的空格/制表符与换行符一起使用,并且仍然应该将其视为段落。
我正在使用Python,所以解决方案可以使用python的regular expression syntax这是扩展。 (可利用(?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
秒。
答
不幸的是,没有很好的方式来写“空间而不是换行符”。
我认为你能做的最好的就是添加一些空间与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”;-)
+0
整洁的解决方案。什么是'str_isspace`? – 2011-11-01 18:12:14
有。 [^ \ S \ n] :) – 2009-03-05 12:21:29