Python regex coincide con el párrafo completo, incluida una nueva línea
Tengo un archivo de texto, de ahí quiero hacer coincidir el bloque de párrafo completo, pero mi expresión regular actual no funciona para coincidir con el párrafo completo, incluida la nueva línea.
Ejemplo 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.
Desde el bloque de texto anterior, quiero hacer coincidir el párrafo completo que comienza con la palabra 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.
Lo que he probado
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()))
Salida:
Encontrado en la línea 1305: NOMEAR JOSIAS CARLOS BORRHER do cargo em comissão
Encontrado en la línea 1316: NOMEAR RAFAEL DOS SANTOS PASSAGEM para exercer o cargo
Respuestas
Puede usar esta expresión regular más simple usando el MULTILINEmodo:
^NOMEAR.+(?:\n.+)*
En 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))
Demostración de RegEx
Usando este patrón:
(NOMEAR (?:.+\n)+)
Y 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))
El resultado es (formateé las nuevas líneas para que fueran más legibles ya que todo venía en una línea):
['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']
¿Está intentando encontrar 2 coincidencias en su texto de muestra? es decir, las 2 porciones que comienzan con NOMEAR y terminan con un punto seguido de 2 nuevas líneas o el final de todo el 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))
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.