Probar una expresión regular escrita por IA con ejemplos positivos y negativos
Trata una expresión regular generada por IA como un borrador, no como una regla terminada. Crea una pequeña tabla de pruebas sintéticas, compara las coincidencias esperadas con las reales, corrige el patrón y guarda un informe de revisión antes de usarlo con datos reales.
Contenido revisado 2026.09.20Incluye código de ejemplo
Ver el índice
La traducción se ha realizado con IA. Comprueba el código, las unidades y los valores junto con el original. La revisión por hablantes nativos de cada idioma aún no se ha completado. English
Para quién esEsta guía es para personas que usan IA para redactar expresiones regulares y quieren una forma sencilla de comprobar el patrón con casos conocidos que deben coincidir y no coincidir.
Preparación
Python 3.12 y un comando de terminal que inicie esa versión.
Un editor de texto que pueda guardar archivos CSV y Python en UTF-8.
Una carpeta de trabajo donde el script pueda crear una carpeta nueva dentro de outputs.
Solo se necesita la biblioteca estándar de Python: csv, pathlib y re.
01Escribe el requisito antes de probar la expresión regular
Supongamos que un ID interno de trabajo debe tener el formato WK-YYYY-NNNN. El prefijo debe ser WK en mayúsculas, el año debe estar entre 2000 y 2099, los separadores deben ser guiones y la parte final debe contener exactamente cuatro dígitos ASCII.
Imagina que un asistente de IA propone el patrón WK-\d{4}-\d{4}. Parece razonable, pero solo exige cuatro dígitos para el año. No aplica el intervalo indicado de 2000-2099. El siguiente paso más seguro no es usarlo de inmediato, sino probarlo con ejemplos cuya respuesta ya conoces.
02Crea un conjunto sintético de casos de prueba
El siguiente conjunto de datos es sintético y se creó específicamente para este artículo. Guárdalo como regex_cases.csv. Contiene tres cadenas que deben coincidir y siete que no deben hacerlo.
Los casos cubren los límites permitidos del año, un año fuera de rango, un prefijo en minúsculas, campos de secuencia demasiado cortos y demasiado largos, un separador incorrecto, espacio en blanco al inicio y un carácter no numérico en el año. Son suficientemente pequeños para clasificarlos manualmente antes de ejecutar cualquier expresión regular.
03Predice qué hará mal el patrón de IA
El patrón de IA WK-\d{4}-\d{4} debería aceptar C001, C002 y C003. Por razones estructurales debería rechazar C005 hasta C010. Sin embargo, también acepta C004 porque 1999 sigue estando formado por cuatro dígitos.
Caso
Esperado
Patrón de IA
Resultado
C001
MATCH
MATCH
PASS
C002
MATCH
MATCH
PASS
C003
MATCH
MATCH
PASS
C004
NO MATCH
MATCH
FAIL
C005
NO MATCH
NO MATCH
PASS
C006
NO MATCH
NO MATCH
PASS
C007
NO MATCH
NO MATCH
PASS
C008
NO MATCH
NO MATCH
PASS
C009
NO MATCH
NO MATCH
PASS
C010
NO MATCH
NO MATCH
PASS
El patrón revisado es WK-20[0-9]{2}-[0-9]{4}. El prefijo 20 restringe el año al intervalo de 2000 a 2099, y [0-9] hace explícito el conjunto de dígitos previsto. El script usa fullmatch, por lo que toda la cadena de entrada debe cumplir el patrón.
04Compara automáticamente las coincidencias esperadas y reales
Guarda el siguiente script como ai_regex_check.py. Prueba tanto la propuesta de la IA como el patrón revisado, escribe cada caso en un informe CSV y se niega a reutilizar una carpeta de salida existente.
python
import csv
import re
from pathlib import Path
SOURCE = Path("regex_cases.csv")
OUTPUT_DIR = Path("outputs") / "regex_check_result"
REPORT = OUTPUT_DIR / "regex_check.csv"
AI_PATTERN = re.compile(r"WK-\d{4}-\d{4}")
REVISED_PATTERN = re.compile(r"WK-20[0-9]{2}-[0-9]{4}")
def parse_expected(value: str) -> bool:
normalized = value.strip().lower()
if normalized == "yes":
return True
if normalized == "no":
return False
raise ValueError(f"Expected yes or no, got: {value!r}")
def label(value: bool) -> str:
return "MATCH" if value else "NO MATCH"
def main() -> None:
if not SOURCE.is_file():
raise FileNotFoundError(f"Source CSV not found: {SOURCE}")
if OUTPUT_DIR.exists():
raise FileExistsError(f"Output folder already exists: {OUTPUT_DIR}")
results = []
ai_failures = 0
revised_failures = 0
with SOURCE.open("r", encoding="utf-8-sig", newline="") as stream:
reader = csv.DictReader(stream)
required = {"case_id", "value", "should_match"}
if reader.fieldnames is None or not required.issubset(reader.fieldnames):
raise ValueError("CSV is missing a required column.")
for row_number, row in enumerate(reader, start=2):
expected = parse_expected(row["should_match"])
text = row["value"]
ai_actual = AI_PATTERN.fullmatch(text) is not None
revised_actual = REVISED_PATTERN.fullmatch(text) is not None
ai_pass = ai_actual == expected
revised_pass = revised_actual == expected
if not ai_pass:
ai_failures += 1
if not revised_pass:
revised_failures += 1
results.append({
"case_id": row["case_id"],
"value": text,
"expected": label(expected),
"ai_actual": label(ai_actual),
"ai_test": "PASS" if ai_pass else "FAIL",
"revised_actual": label(revised_actual),
"revised_test": "PASS" if revised_pass else "FAIL",
})
OUTPUT_DIR.parent.mkdir(parents=True, exist_ok=True)
OUTPUT_DIR.mkdir()
fields = [
"case_id", "value", "expected", "ai_actual", "ai_test",
"revised_actual", "revised_test"
]
with REPORT.open("x", encoding="utf-8", newline="") as stream:
writer = csv.DictWriter(stream, fieldnames=fields)
writer.writeheader()
writer.writerows(results)
print(f"Cases: {len(results)}.")
print(f"AI pattern failures: {ai_failures}.")
print(f"Revised pattern failures: {revised_failures}.")
print(f"Report: {REPORT.as_posix()}")
if revised_failures:
raise RuntimeError("Revised pattern still fails one or more tests.")
if __name__ == "__main__":
main()
text
python ai_regex_check.py
05Comprueba el informe esperado
Hay 10 casos de prueba. El patrón de IA debe fallar exactamente en un caso, C004. El patrón revisado debe superar los 10 casos.
Medida
Valor esperado
Casos
10
Fallos del patrón de IA
1
Fallos del patrón revisado
0
Caso de fallo de IA
C004
Casos aprobados por el patrón revisado
10
La salida de consola esperada se obtuvo manualmente a partir de la tabla de pruebas y del script. No es un registro capturado de una ejecución.
Incluye límites mínimo y máximo válidos, como 2000 y 2099 en este ejemplo.
Incluye al menos un valor justo fuera de un límite, como 1999.
Prueba mayúsculas y minúsculas incorrectas, separadores, longitudes de campo, espacios en blanco y caracteres no válidos.
Usa fullmatch cuando el requisito indique que toda la cadena debe cumplir el formato.
Vuelve a ejecutar el script sin cambiar OUTPUT_DIR. Debe detenerse con FileExistsError en lugar de sobrescribir el informe anterior.
Error
Por qué importa
Probar solo cadenas que deben coincidir
Una expresión regular demasiado permisiva puede parecer correcta hasta que se prueba un caso negativo.
Usar un patrón de IA sin volver a formular el requisito
El patrón puede resolver un problema ligeramente distinto del que querías resolver.
Comprobar solo un ejemplo normal
Los errores de límite, longitud, mayúsculas y minúsculas y separadores quedan sin probar.
Usar search en vez de fullmatch para una regla de campo completo
Puede encontrarse una subcadena aparentemente válida dentro de un valor que en conjunto es inválido.
Cambiar las respuestas esperadas después de ver la salida de la expresión regular
La prueba deja de ser una especificación independiente del comportamiento requerido.
07Entiende lo que las pruebas de expresiones regulares no demuestran
Superar estas 10 pruebas solo demuestra que el patrón revisado se comporta correctamente para estos 10 ejemplos sintéticos. No demuestra matemáticamente que todos los posibles valores de entrada se gestionen correctamente. Añade casos cuando aparezca un nuevo límite o modo de fallo.
Una expresión regular también valida la sintaxis, no la realidad del negocio. WK-2026-1234 puede coincidir perfectamente aunque ese ID no exista en tu base de datos. La existencia, la unicidad, la autorización y las relaciones con otros campos requieren comprobaciones separadas.
Este pequeño ejemplo no evalúa el rendimiento con entradas muy largas o diseñadas de forma adversarial. Los patrones más complejos generados por IA deben revisarse tanto por su corrección como por su comportamiento en tiempo de ejecución antes de usarlos en servicios que procesan texto no confiable.
Registro de ejecución y verificación
ChatGPT Python tool · Python 3.13.5 · standard library csv/pathlib/re
La ejecución principal imprimió exactamente: 'Cases: 10.', 'AI pattern failures: 1.', 'Revised pattern failures: 0.' y 'Report: outputs/regex_check_result/regex_check.csv'.
regex_check.csv contenía exactamente 10 filas de datos además de su encabezado.
El patrón de IA WK-\d{4}-\d{4} falló exactamente en C004, aceptando WK-1999-0001 aunque el resultado esperado era NO MATCH.
Todos los demás casos del patrón de IA coincidieron con sus clasificaciones esperadas.
El patrón revisado WK-20[0-9]{2}-[0-9]{4} superó los 10 casos sintéticos.
Por tanto, el resultado revisado tuvo 0 fallos, coincidiendo exactamente con la tabla y la salida de consola esperadas del artículo.
La segunda ejecución se detuvo con FileExistsError porque outputs/regex_check_result ya existía, tal como se requería.
Límites de la verificación
Solo se probaron los 10 casos sintéticos del artículo; no se estableció la corrección exhaustiva de la expresión regular.
No se probó el rendimiento con cadenas muy largas o diseñadas de forma adversaria.
No se probaron por separado CSV mal formados, valores de etiqueta esperada no válidos, columnas obligatorias faltantes ni fallos de permisos del sistema de archivos.
Fuentes de referencia
Las explicaciones y los ejemplos son de elaboración propia. Puedes consultar los comportamientos y conceptos relacionados en las siguientes fuentes oficiales.
Convierte “automatiza esto” en una descripción de tarea ejecutable. Adjunta una muestra sintética sin datos sensibles y un resultado esperado comprobado manualmente para completar una solicitud de script que totalice registros de trabajo por equipo.
Comprueba una función de agregación con cuatro filas que puedes calcular manualmente y 12 unit tests. Verifica no solo valores normales, sino también entrada vacía, cero, decimales y entrada no válida.
Compara un informe de IA con sus datos de origen, recalcula totales y porcentajes y usa una instrucción para detectar afirmaciones sin respaldo y causas exageradas antes de entregarlo.
Trata una consulta SQL generada por IA como un borrador y pruébala en una pequeña base de datos SQLite con respuestas conocidas. Compara el resultado de la IA con una tabla esperada calculada manualmente antes de usar la consulta con datos reales.