-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdiario_ama.py
78 lines (61 loc) · 2.95 KB
/
diario_ama.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import re
import diario_municipal
# No final do regex, existe uma estrutura condicional que verifica se o próximo match é um \s ou SECRETARIA. Isso foi feito para resolver um problema no diário de 2018-10-02, em que o município de Coité do Nóia não foi percebido pelo código. Para resolver isso, utilizamos a próxima palavra (SECRETARIA) para tratar esse caso.
# Exceções Notáveis
# String: VAMOS, município Poço das Trincheiras, 06/01/2022, ato CCB3A6AB
re_nomes_municipios = (
r"ESTADO DE ALAGOAS(?:| )\n{1,2}PREFEITURA MUNICIPAL DE (.*\n{0,2}(?!VAMOS).*$)\n\s(?:\s|SECRETARIA)")
def extrair_diarios_municipais(texto_diario: str):
texto_diario_slice = texto_diario.lstrip().splitlines()
# Processamento
linhas_apagar = [] # slice de linhas a ser apagadas ao final.
ama_header = texto_diario_slice[0]
ama_header_count = 0
codigo_count = 0
codigo_total = texto_diario.count("Código Identificador")
for num_linha, linha in enumerate(texto_diario_slice):
# Remoção do cabeçalho AMA, porém temos que manter a primeira aparição.
if linha.startswith(ama_header):
ama_header_count += 1
if ama_header_count > 1:
linhas_apagar.append(num_linha)
# Remoção das linhas finais
if codigo_count == codigo_total:
linhas_apagar.append(num_linha)
elif linha.startswith("Código Identificador"):
codigo_count += 1
# Apagando linhas do slice
texto_diario_slice = [l for n, l in enumerate(
texto_diario_slice) if n not in linhas_apagar]
# Inserindo o cabeçalho no diário de cada município.
texto_diarios = {}
nomes_municipios = re.findall(
re_nomes_municipios, texto_diario, re.MULTILINE)
for municipio in nomes_municipios:
municipio = diario_municipal.Municipio(municipio)
texto_diarios[municipio] = ama_header + '\n\n'
num_linha = 0
municipio_atual = None
while num_linha < len(texto_diario_slice):
linha = texto_diario_slice[num_linha].rstrip()
if linha.startswith("ESTADO DE ALAGOAS"):
nome = nome_municipio(texto_diario_slice, num_linha)
if nome is not None:
municipio_atual = diario_municipal.Municipio(nome)
# Só começa, quando algum muncípio for encontrado.
if municipio_atual is None:
num_linha += 1
continue
# Conteúdo faz parte de um muncípio
texto_diarios[municipio_atual] += linha + '\n'
num_linha += 1
diarios = []
for municipio, diario in texto_diarios.items():
diarios.append(diario_municipal.Diario(municipio, ama_header, diario))
return diarios
def nome_municipio(texto_diario_slice: slice, num_linha: int):
texto = '\n'.join(texto_diario_slice[num_linha:num_linha+10])
match = re.findall(re_nomes_municipios, texto, re.MULTILINE)
if len(match) > 0:
return match[0].strip().replace('\n', '')
return None