python regex abbina l'intero paragrafo inclusa la nuova riga
Ho un file di testo, da quello voglio far corrispondere l'intero blocco di paragrafo ma la mia espressione regolare corrente non funziona per abbinare l'intero paragrafo inclusa la nuova riga.
Esempio di testo:
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.
Dal blocco di testo sopra voglio abbinare l'intero paragrafo che inizia con la parola 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.
Quello che ho provato
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()))
Produzione:
Trovato sulla linea 1305: NOMEAR JOSIAS CARLOS BORRHER do cargo em comissão
Trovato sulla linea 1316: NOMEAR RAFAEL DOS SANTOS PASSAGEM para esercitatore o carico
Risposte
Puoi usare questa regex più semplice usando la MULTILINEmodalità:
^NOMEAR.+(?:\n.+)*
In pitone:
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
Utilizzando questo modello:
(NOMEAR (?:.+\n)+)
E questo codice:
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))
L'output è (ho formattato le nuove righe per essere più leggibili poiché era tutto in una riga):
['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']
Stai cercando di trovare 2 corrispondenze nel tuo testo di esempio; cioè, le 2 parti che iniziano con NOMEAR e finiscono con un punto seguito da 2 nuove righe o dalla fine dell'intero testo?
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.