python regex corresponde ao parágrafo completo, incluindo nova linha

Nov 25 2020

Tenho um arquivo de texto, do qual desejo corresponder o bloco de parágrafo completo, mas minha regex atual não funciona para corresponder ao parágrafo completo, incluindo a nova linha.

Exemplo de texto:

NOMEAR JOSIAS CARLOS BORRHER do cargo em comissão
OTHER TEXT GOES HERE
....................
020007/002832/2020.

EXONERAR DOUGLAS ALVES BORRHER do cargo em comissão
OTHER TEXT GOES HERE
....................
020007/002832/2020.

NOMEAR RAFAEL DOS SANTOS PASSAGEM para exercer o cargo
OTHER TEXT GOES HERE
....................
020007/002832/2020.

A partir do bloco de texto acima, quero combinar o parágrafo completo começando com a palavra NOMEAR

NOMEAR JOSIAS CARLOS BORRHER do cargo em comissão
OTHER TEXT GOES HERE
....................
020007/002832/2020.


NOMEAR RAFAEL DOS SANTOS PASSAGEM para exercer o cargo
OTHER TEXT GOES HERE
....................
020007/002832/2020.

O que eu tentei

import re
pattern = re.compile("NOMEAR (.*)", re.DOTALL)

for i, line in enumerate(open('pdf_text_tika.txt')):
    for match in re.finditer(pattern, line):
        print ('Found on line %s: %s' % (i+1, match.group()))

Resultado:

Encontrado na linha 1305: NOMEAR JOSIAS CARLOS BORRHER do cargo em comissão

Encontrado na linha 1316: NOMEAR RAFAEL DOS SANTOS PASSAGEM para exercer a carga

Respostas

1 anubhava Nov 25 2020 at 18:11

Você pode usar este regex mais simples usando o MULTILINEmodo:

^NOMEAR.+(?:\n.+)*

Em python:

import re

pattern = re.compile(r'^NOMEAR.+(?:\n.+)*', re.MULTILINE)

with open('pdf_text_tika.txt', 'r') as file:
    data = file.read()

print (pattern.findall(data))

RegEx Demo

1 VoidTwo Nov 25 2020 at 20:09

Usando este padrão:

(NOMEAR (?:.+\n)+)

E este código:

import re

pattern = re.compile(r'(NOMEAR (?:.+\n)+)')
text = 'NOMEAR JOSIAS CARLOS BORRHER do cargo em comissão\n' \
    'OTHER TEXT GOES HERE\n' \
    '....................\n' \
    '020007/002832/2020.\n\n' \
    'EXONERAR DOUGLAS ALVES BORRHER do cargo em comissão\n' \
    'OTHER TEXT GOES HERE\n' \
    '....................\n' \
    '020007/002832/2020.\n\n' \
    'NOMEAR RAFAEL DOS SANTOS PASSAGEM para exercer o cargo\n' \
    'OTHER TEXT GOES HERE\n' \
    '....................\n' \
    '020007/002832/2020.'

print(pattern.findall(text))

A saída é (formatei as novas linhas para serem mais legíveis, pois tudo veio em uma linha):

['NOMEAR JOSIAS CARLOS BORRHER do cargo em comissão\n
OTHER TEXT GOES HERE\n
....................\n
020007/002832/2020.\n',

'NOMEAR RAFAEL DOS SANTOS PASSAGEM para exercer o cargo\n
OTHER TEXT GOES HERE\n
....................\n']
brensnap Nov 25 2020 at 18:21

Você está tentando encontrar 2 correspondências em seu texto de exemplo; isto é, as 2 partes que começam com NOMEAR e terminam com um ponto seguido por 2 novas linhas ou o final de todo o texto?

import re

text = """NOMEAR JOSIAS CARLOS BORRHER do cargo em comissão
OTHER TEXT GOES HERE
....................
020007/002832/2020.

EXONERAR DOUGLAS ALVES BORRHER do cargo em comissão
OTHER TEXT GOES HERE
....................
020007/002832/2020.

NOMEAR RAFAEL DOS SANTOS PASSAGEM para exercer o cargo
OTHER TEXT GOES HERE
....................
020007/002832/2020."""

pattern = re.compile("NOMEAR (?:.*?).(?:\n\n|\Z)", re.DOTALL)

matches = re.findall(pattern, text)

print("".join(matches))
HenryTjhia Nov 25 2020 at 18:22
import re
t = """NOMEAR JOSIAS CARLOS BORRHER do cargo em comissão
OTHER TEXT GOES HERE
....................
020007/002832/2020.

EXONERAR DOUGLAS ALVES BORRHER do cargo em comissão
OTHER TEXT GOES HERE
....................
020007/002832/2020.

NOMEAR RAFAEL DOS SANTOS PASSAGEM para exercer o cargo
OTHER TEXT GOES HERE
....................
020007/002832/2020."""

r = re.compile(r'(?=NOMEAR)(.*?)(?<=\d[.])', flags=re.S)

for i in r.finditer(t):
    print(i.group(0))
NOMEAR JOSIAS CARLOS BORRHER do cargo em comissão
OTHER TEXT GOES HERE
....................
020007/002832/2020.
NOMEAR RAFAEL DOS SANTOS PASSAGEM para exercer o cargo
OTHER TEXT GOES HERE
....................
020007/002832/2020.