python expressão regular para parágrafos parciais
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 \n
s
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*?