fccoelho aider (anthropic/claude-sonnet-4-20250514) commited on
Commit
a2074bf
·
1 Parent(s): 8ee16a5

refactor: centralizar padrões regex em variável global

Browse files

Co-authored-by: aider (anthropic/claude-sonnet-4-20250514) <aider@aider.chat>

Files changed (1) hide show
  1. app.py +29 -42
app.py CHANGED
@@ -13,6 +13,33 @@ import io
13
  import json
14
  import re
15
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  class Reference(BaseModel):
17
  authors: List[str]
18
  title: str
@@ -125,36 +152,8 @@ def extract_references_with_regex(text):
125
  try:
126
  references = []
127
 
128
- # Padrões melhorados para extrair referências individuais
129
- patterns = [
130
- # Padrão 0: Referências numeradas com autores múltiplos (formato: Número. Autores. Título. Journal info (ano).)
131
- r'^\d+\.\s*([A-Z][A-Za-z\s,&.-]+?(?:\s&\s[A-Z][A-Za-z\s,&.-]+?)*)\.\s*([^.]+?)\.\s*([^.]+?)\s+(\d+),?\s*([^(]*?)\s*\((\d{4})\)',
132
-
133
- # Padrão 1: Autor(es). (Ano). Título. Journal/Editora.
134
- r'^([A-Z][A-Za-z\s,&.-]+?)\.\s*\((\d{4}[a-z]?)\)\.\s*([^.]+?)\.\s*([^.]+?)\.?\s*$',
135
-
136
- # Padrão 2: Referências numeradas [1] Autor... ano Título. Journal doi:...
137
- r'^\[\d+\]\s*([A-Z][A-Za-z\s,&.-]+?)\s+(\d{4})\s+([^.]+?)\.\s*([^.]+?)(?:\s+doi:([^\s.]+))?\.?\s*$',
138
-
139
- # Padrão 3: Autor, A. (Ano). Título. Journal.
140
- r'^([A-Z][A-Za-z\s,&.-]+?)\s+\((\d{4}[a-z]?)\)[.,]\s*([^.]+?)[.,]\s*([^.]+?)\.?\s*$',
141
-
142
- # Padrão 4: Autor et al. (Ano) Título. Journal
143
- r'^([A-Z][A-Za-z\s,&.-]*?et\s+al\.?)\s*\((\d{4}[a-z]?)\)[.,]?\s*([^.]+?)[.,]\s*([^.]+?)\.?\s*$',
144
-
145
- # Padrão 5: Sobrenome, Nome (Ano). Título. Journal.
146
- r'^([A-Z][a-z]+,\s*[A-Z][A-Za-z\s,&.-]*?)\.\s*\((\d{4}[a-z]?)\)\.\s*([^.]+?)\.\s*([^.]+?)\.?\s*$',
147
-
148
- # Padrão 6: Múltiplos autores com &
149
- r'^([A-Z][A-Za-z\s,&.-]+?&[A-Za-z\s,&.-]+?)\.\s*\((\d{4}[a-z]?)\)\.\s*([^.]+?)\.\s*([^.]+?)\.?\s*$',
150
-
151
- # Padrão 7: Referências numeradas [número] Autor: Título, Editora (ano)
152
- r'^\[\d+\]\s*([A-Z][A-Za-z\s,&.-]+?):\s*([^,]+?),\s*([^(]+?)\s*\((\d{4})\)'
153
- ]
154
- # patterns = [re.compile(pat) for pat in patterns]
155
-
156
  # Processar cada padrão
157
- for pattern_index, pattern in enumerate(patterns):
158
  reflist = re.findall(pattern, text, re.MULTILINE | re.UNICODE | re.DOTALL)
159
 
160
  if reflist:
@@ -228,18 +227,6 @@ def create_highlighted_text(text, regex_references):
228
  lines = text.split('\n')
229
  highlighted_lines = []
230
 
231
- # Padrões para destacar (mesmos da extração)
232
- patterns = [
233
- r'^\d+\.\s*([A-Z][A-Za-z\s,&.-]+?(?:\s&\s[A-Z][A-Za-z\s,&.-]+?)*)\.\s*([^.]+?)\.\s*([^.]+?)\s+(\d+),?\s*([^(]*?)\s*\((\d{4})\)',
234
- r'^([A-Z][A-Za-z\s,&.-]+?)\.\s*\((\d{4}[a-z]?)\)\.\s*([^.]+?)\.\s*([^.]+?)\.?\s*$',
235
- r'^\[\d+\]\s*([A-Z][A-Za-z\s,&.-]+?)\.\s*\((\d{4}[a-z]?)\)\.\s*([^.]+?)\.\s*([^.]+?)\.?\s*$',
236
- r'^([A-Z][A-Za-z\s,&.-]+?)\s+\((\d{4}[a-z]?)\)[.,]\s*([^.]+?)[.,]\s*([^.]+?)\.?\s*$',
237
- r'^([A-Z][A-Za-z\s,&.-]*?et\s+al\.?)\s*\((\d{4}[a-z]?)\)[.,]?\s*([^.]+?)[.,]\s*([^.]+?)\.?\s*$',
238
- r'^([A-Z][a-z]+,\s*[A-Z][A-Za-z\s,&.-]*?)\.\s*\((\d{4}[a-z]?)\)\.\s*([^.]+?)\.\s*([^.]+?)\.?\s*$',
239
- r'^([A-Z][A-Za-z\s,&.-]+?&[A-Za-z\s,&.-]+?)\.\s*\((\d{4}[a-z]?)\)\.\s*([^.]+?)\.\s*([^.]+?)\.?\s*$',
240
- r'^\[\d+\]\s*([A-Z][A-Za-z\s,&.-]+?):\s*([^,]+?),\s*([^(]+?)\s*\((\d{4})\)'
241
- ]
242
-
243
  colors = ['#ff5722', '#ffeb3b', '#4caf50', '#2196f3', '#ff9800', '#9c27b0', '#e91e63', '#795548']
244
 
245
  # Processar cada linha
@@ -249,7 +236,7 @@ def create_highlighted_text(text, regex_references):
249
 
250
  # Verificar se a linha corresponde a algum padrão
251
  matched = False
252
- for i, pattern in enumerate(patterns):
253
  if re.match(pattern, line_stripped, re.MULTILINE | re.IGNORECASE):
254
  if len(line_stripped) >= 20 and line_stripped[0].isupper():
255
  color = colors[i % len(colors)]
 
13
  import json
14
  import re
15
 
16
+ # Padrões globais de regex para extração de referências
17
+ REFERENCE_PATTERNS = [
18
+ # Padrão 0: Referências numeradas com autores múltiplos (formato: Número. Autores. Título. Journal info (ano).)
19
+ r'^\d+\.\s*([A-Z][A-Za-z\s,&.-]+?(?:\s&\s[A-Z][A-Za-z\s,&.-]+?)*)\.\s*([^.]+?)\.\s*([^.]+?)\s+(\d+),?\s*([^(]*?)\s*\((\d{4})\)',
20
+
21
+ # Padrão 1: Autor(es). (Ano). Título. Journal/Editora.
22
+ r'^([A-Z][A-Za-z\s,&.-]+?)\.\s*\((\d{4}[a-z]?)\)\.\s*([^.]+?)\.\s*([^.]+?)\.?\s*$',
23
+
24
+ # Padrão 2: Referências numeradas [1] Autor... ano Título. Journal doi:...
25
+ r'^\[\d+\]\s*([A-Z][A-Za-z\s,&.-]+?)\s+(\d{4})\s+([^.]+?)\.\s*([^.]+?)(?:\s+doi:([^\s.]+))?\.?\s*$',
26
+
27
+ # Padrão 3: Autor, A. (Ano). Título. Journal.
28
+ r'^([A-Z][A-Za-z\s,&.-]+?)\s+\((\d{4}[a-z]?)\)[.,]\s*([^.]+?)[.,]\s*([^.]+?)\.?\s*$',
29
+
30
+ # Padrão 4: Autor et al. (Ano) Título. Journal
31
+ r'^([A-Z][A-Za-z\s,&.-]*?et\s+al\.?)\s*\((\d{4}[a-z]?)\)[.,]?\s*([^.]+?)[.,]\s*([^.]+?)\.?\s*$',
32
+
33
+ # Padrão 5: Sobrenome, Nome (Ano). Título. Journal.
34
+ r'^([A-Z][a-z]+,\s*[A-Z][A-Za-z\s,&.-]*?)\.\s*\((\d{4}[a-z]?)\)\.\s*([^.]+?)\.\s*([^.]+?)\.?\s*$',
35
+
36
+ # Padrão 6: Múltiplos autores com &
37
+ r'^([A-Z][A-Za-z\s,&.-]+?&[A-Za-z\s,&.-]+?)\.\s*\((\d{4}[a-z]?)\)\.\s*([^.]+?)\.\s*([^.]+?)\.?\s*$',
38
+
39
+ # Padrão 7: Referências numeradas [número] Autor: Título, Editora (ano)
40
+ r'^\[\d+\]\s*([A-Z][A-Za-z\s,&.-]+?):\s*([^,]+?),\s*([^(]+?)\s*\((\d{4})\)'
41
+ ]
42
+
43
  class Reference(BaseModel):
44
  authors: List[str]
45
  title: str
 
152
  try:
153
  references = []
154
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
155
  # Processar cada padrão
156
+ for pattern_index, pattern in enumerate(REFERENCE_PATTERNS):
157
  reflist = re.findall(pattern, text, re.MULTILINE | re.UNICODE | re.DOTALL)
158
 
159
  if reflist:
 
227
  lines = text.split('\n')
228
  highlighted_lines = []
229
 
 
 
 
 
 
 
 
 
 
 
 
 
230
  colors = ['#ff5722', '#ffeb3b', '#4caf50', '#2196f3', '#ff9800', '#9c27b0', '#e91e63', '#795548']
231
 
232
  # Processar cada linha
 
236
 
237
  # Verificar se a linha corresponde a algum padrão
238
  matched = False
239
+ for i, pattern in enumerate(REFERENCE_PATTERNS):
240
  if re.match(pattern, line_stripped, re.MULTILINE | re.IGNORECASE):
241
  if len(line_stripped) >= 20 and line_stripped[0].isupper():
242
  color = colors[i % len(colors)]