[英]Python regular expression to split paragraphs
如何编写在 Python 中使用的正则表达式来拆分段落?
一个段落由两个换行符 (\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\f\v]*? \n ){2} [ \t\r\f\v]*?
您也可以尝试为字符类创建一个子规则并将其插值三次。
您可能试图在 plain test 中推断文档的结构并执行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*?
一个人将如何编写一个正则表达式以在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的段落分隔符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.