Python regex correspond au paragraphe complet, y compris la nouvelle ligne
J'ai un fichier texte, à partir de là, je veux faire correspondre le bloc de paragraphe complet, mais mon expression régulière actuelle ne fonctionne pas pour correspondre au paragraphe complet, y compris la nouvelle ligne.
Exemple de texte:
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.
À partir du bloc de texte ci-dessus, je veux faire correspondre le paragraphe complet commençant par le mot 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.
Ce que j'ai essayé
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()))
Production:
Trouvé sur la ligne 1305: NOMEAR JOSIAS CARLOS BORRHER do cargo em comissão
Trouvé sur la ligne 1316: NOMEAR RAFAEL DOS SANTOS PASSAGEM para exercer o cargo
Réponses
Vous pouvez utiliser cette expression régulière plus simple en utilisant le MULTILINE
mode:
^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))
Démo RegEx
En utilisant ce modèle:
(NOMEAR (?:.+\n)+)
Et ce code:
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))
Le résultat est (j'ai formaté les nouvelles lignes pour être plus lisibles car tout est venu sur une seule ligne):
['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']
Essayez-vous de trouver 2 correspondances dans votre exemple de texte; c'est-à-dire, les 2 parties qui commencent par NOMEAR et se terminent par un point suivi soit de 2 nouvelles lignes ou de la fin du texte entier?
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.