代码之家  ›  专栏  ›  技术社区  ›  nosklo

分割段落的python正则表达式

  •  5
  • nosklo  · 技术社区  · 16 年前

    如何编写一个正则表达式以在python中用于分割段落?

    段落由两个换行符(\n)定义。但是可以有任意数量的空格/制表符和换行符,它仍然应该被视为一个段落。

    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 \n s

    4 回复  |  直到 7 年前
        1
  •  5
  •   Eevee    16 年前

    不幸的是,没有写“空格但不是换行”的好方法。

    我认为你能做的最好的事情就是用 x 修改并尝试将丑陋因素稍微排除,但这是值得怀疑的: (?x) (?: [ \t\r\f\v]*? \n ){2} [ \t\r\f\v]*?

    您还可以尝试仅为角色类创建一个子规则并对其插值三次。

        2
  •  2
  •   S.Lott    16 年前

    您是否试图在普通测试中推断文档的结构?你在做什么 docutils

    您可以简单地使用 Docutils parser 而不是自己滚。

        3
  •  2
  •   Bite code    12 年前

    不是regexp,但非常优雅:

    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'
    

    当然,您可以根据需要剥离输出。

        4
  •  0
  •   Joseph Bui    16 年前

    几乎相同,但使用非贪婪量词并利用空格序列。

    \s*?\n\s*?\n\s*?
    
        5
  •  0
  •   traal    3 年前

    仅供参考:我刚刚在另一个线程中为这类问题编写了两个解决方案。首先使用此处要求的正则表达式,然后使用一种状态机方法,该方法一次通过一行输入:

    https://stackoverflow.com/a/64863601/5201675