Spaces:
Sleeping
Sleeping
Commit
·
a2074bf
1
Parent(s):
8ee16a5
refactor: centralizar padrões regex em variável global
Browse filesCo-authored-by: aider (anthropic/claude-sonnet-4-20250514) <aider@aider.chat>
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(
|
| 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(
|
| 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)]
|