Pergunta

Como se poderia escrever uma expressão regular para uso em python para parágrafos parciais?

Um parágrafo é definida por 2 quebras de linha (\ n). Mas um pode ter qualquer quantidade de espaços / guias juntamente com as quebras de linha, e ainda deve ser considerada como um parágrafo.

Eu estou usando python para que a solução pode usar o expressão regular sintaxe python que é estendido. (Pode fazer uso de coisas (?P...))

Exemplos:

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']

O melhor que eu poderia vir com é:. r'[ \t\r\f\v]*\n[ \t\r\f\v]*\n[ \t\r\f\v]*', i

import re
paragraphs = re.split(r'[ \t\r\f\v]*\n[ \t\r\f\v]*\n[ \t\r\f\v]*', the_str)

mas isso é feio. Qualquer coisa melhor?

Editar :

Sugestões rejeitadas:

r'\s*?\n\s*?\n\s*?' -.> Isso faria exemplo 2 e 3 falhar, uma vez \s inclui \n, por isso permitiria quebras de parágrafo com mais de 2 \ns

Foi útil?

Solução

Infelizmente não há nenhuma boa maneira de escrever "espaço, mas não uma nova linha".

Eu acho que o melhor que você pode fazer é adicionar algum espaço com o modificador x e tentar fator a feiúra um pouco, mas isso é questionável: (?x) (?: [ \t\r\f\v]*? \n ){2} [ \t\r\f\v]*?

Você também pode tentar criar uma sub-regra apenas para a classe de personagem e interpolando-lo três vezes.

Outras dicas

Você está tentando deduzir a estrutura de um documento em teste simples? Você está fazendo o docutils faz?

Você pode ser capaz de usar simplesmente o Docutils analisador em vez de rolar o seu próprio.

Não é um regexp mas realmente elegante:

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'

É até você tira a saída como você precisar dele, é claro.

Inspirado do famoso "Python Cookbook"; -)

Quase a mesma, mas usando quantificadores não-ávidos e tirando partido da sequência de espaços em branco.

\s*?\n\s*?\n\s*?
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top