{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "f560a102",
   "metadata": {},
   "source": [
    "## Lectura de archivos 🖨️"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "c6d827f6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tamaño 6896\n",
      "tamaño 3276\n",
      "tamaño 6896\n",
      "tamaño 13055\n"
     ]
    }
   ],
   "source": [
    "with open('data/text_ex.txt', \"r\", encoding='utf-8', errors='ignore') as f:\n",
    "    data = f.readlines()\n",
    "\n",
    "print(f\"tamaño {len( ''.join(data))}\")\n",
    "\n",
    "with open('data/text_ex.txt', \"r\", encoding='ascii', errors='ignore') as f:\n",
    "    data = f.readlines()\n",
    "print(f\"tamaño {len( ''.join(data))}\")\n",
    "with open('data/text_ex.txt', \"r\", encoding='utf-8', errors='replace') as f:\n",
    "    data = f.readlines()\n",
    "\n",
    "print(f\"tamaño {len( ''.join(data))}\")\n",
    "\n",
    "with open('data/text_ex.txt', \"r\", encoding='ascii', errors='replace') as f:\n",
    "    data = f.readlines()\n",
    "print(f\"tamaño {len( ''.join(data))}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "066774a3",
   "metadata": {},
   "source": [
    "## Imprimiendo 💎💎"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c8423013",
   "metadata": {},
   "outputs": [],
   "source": [
    "with open(\"data\\personajes.csv\",encoding=\"utf-8\") as f:\n",
    "    data = [linea.strip().split(\",\") for linea in f]\n",
    "primera = data[0]\n",
    "print(\"-\"*42)\n",
    "print(f\"|{primera[0]:^10s}|{primera[1]:^6s}|{primera[2]:^6s}|{primera[3]:^15s}|\")\n",
    "print(\"-\"*42)\n",
    "for line in data[1:]:\n",
    "    print(f\"|{line[0]:10s}|{int(line[1]):>6d}|{float(line[2]):6.1f}|{line[3]:^15.15s}|\")\n",
    "print(\"-\"*42)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "715b627f",
   "metadata": {},
   "source": [
    "# Validación de Contraseñas🔐"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "7953bcfb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "'P@ssw0rd' es una contraseña válida.\n",
      "'Segura123' es una contraseña válida.\n",
      "'Micontra123' es una contraseña válida.\n",
      "'Abc123!' no es una contraseña válida.\n",
      "'demasiadoCorta' no es una contraseña válida.\n"
     ]
    }
   ],
   "source": [
    "import re\n",
    "\n",
    "def validar_contrasena(contrasena):\n",
    "    # Definir la expresión regular para validar la contraseña\n",
    "    patron = r\"^(?=.*[A-Z])(?=.*[a-z])(?=.*\\d)[A-Za-z\\d!@#$%]{8,}$\"\n",
    "\n",
    "    # Comprobar si la contraseña cumple con el patrón\n",
    "    if re.fullmatch(patron, contrasena):\n",
    "        return True\n",
    "    else:\n",
    "        return False\n",
    "\n",
    "# Lista de contraseñas para validar\n",
    "contrasenas = [\n",
    "    \"P@ssw0rd\",\n",
    "    \"Segura123\",\n",
    "    \"Micontra123\",\n",
    "    \"Abc123!\",\n",
    "    \"demasiadoCorta\",\n",
    "]\n",
    "\n",
    "for contrasena in contrasenas:\n",
    "    if validar_contrasena(contrasena):\n",
    "        print(f\"'{contrasena}' es una contraseña válida.\")\n",
    "    else:\n",
    "        print(f\"'{contrasena}' no es una contraseña válida.\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b2edf76f",
   "metadata": {},
   "source": [
    "*Nota para los ayudantes:*\n",
    "\n",
    "- ^: Esto denota el inicio del string. La expresión regular buscará un patrón que comience desde el principio de la cadena.\n",
    "\n",
    "- (?=.*[A-Z]): Este es un \"lookahead\" que verifica si la cadena contiene al menos una letra mayúscula (A-Z). El (?= ... ) es una construcción que no consume caracteres, pero verifica si el patrón que contiene se cumple más adelante en la cadena.\n",
    "\n",
    "- (?=.*[a-z]): Similar al anterior, este \"lookahead\" verifica si la cadena contiene al menos una letra minúscula (a-z).\n",
    "\n",
    "- (?=.*\\d): Otro \"lookahead\" que verifica si la cadena contiene al menos un dígito (0-9).\n",
    "\n",
    "- `[A-Za-z\\d!@#$%]{8,}`: Aquí se especifica que la cadena debe contener caracteres de la clase `[A-Za-z\\d!@#$%]` con una longitud mínima de 8 caracteres. Esta clase incluye letras mayúsculas, minúsculas, dígitos y algunos caracteres especiales como !, @, #, $, y %.\n",
    "\n",
    "- $: Esto denota el final del string. La expresión regular buscará el patrón hasta el final de la cadena."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "142e01cb",
   "metadata": {},
   "source": [
    "# Validación de Números de Teléfono☎️"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "f94046bb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "'123-456-7890' es un número de teléfono válido.\n",
      "'(123) 456-7890' es un número de teléfono válido.\n",
      "'123 456 7890' es un número de teléfono válido.\n",
      "'1234-567-890' no es un número de teléfono válido.\n",
      "'(123 456-7890' no es un número de teléfono válido.\n",
      "'4567-890' no es un número de teléfono válido.\n"
     ]
    }
   ],
   "source": [
    "import re\n",
    "\n",
    "def validar_numero_telefono(telefono):\n",
    "    # Definir la expresión regular para validar el número de teléfono\n",
    "    patron1 = r\"^\\(\\d{3}\\)[-\\s]?\\d{3}[-\\s]?\\d{4}$\"\n",
    "    patron2 = r\"^\\d{3}[-\\s]?\\d{3}[-\\s]?\\d{4}$\"\n",
    "\n",
    "    # Comprobar si el número de teléfono cumple con el patrón\n",
    "    if re.match(patron1, telefono) or re.match(patron2, telefono):\n",
    "        return True\n",
    "    else:\n",
    "        return False\n",
    "\n",
    "# Lista de números de teléfono para validar\n",
    "numeros_telefono = [\n",
    "    \"123-456-7890\",\n",
    "    \"(123) 456-7890\",\n",
    "    \"123 456 7890\",\n",
    "    \"1234-567-890\",\n",
    "    \"(123 456-7890\",\n",
    "    \"4567-890\",\n",
    "]\n",
    "\n",
    "for telefono in numeros_telefono:\n",
    "    if validar_numero_telefono(telefono):\n",
    "        print(f\"'{telefono}' es un número de teléfono válido.\")\n",
    "    else:\n",
    "        print(f\"'{telefono}' no es un número de teléfono válido.\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "697f886b",
   "metadata": {},
   "source": [
    "*Nota para los ayudantes:*\n",
    "\n",
    "- ^: Esto indica que la coincidencia debe comenzar al principio de la cadena de texto.\n",
    "- \\(: Esto se utiliza para coincidir con un paréntesis abierto \"(\" literal. Debido a que el paréntesis \"(\" es un carácter especial en expresiones regulares, debemos usar \\ para escaparlo y hacerlo coincidir literalmente.\n",
    "- \\d{3}: Esto coincide con exactamente tres dígitos. \\d es una abreviatura que representa cualquier dígito (0-9), y {3} indica que debe haber tres dígitos consecutivos.\n",
    "- \\): Esto coincide con un paréntesis cerrado \")\" literal.\n",
    "- [-\\s]?: Esto coincide con un guión \"-\" o un espacio en blanco \"\\s\", pero el \"?\" significa que esta parte es opcional. Por lo tanto, esto permite que haya un guión o un espacio en blanco después del cierre del paréntesis, pero no es obligatorio.\n",
    "- \\d{3}: Esto coincide nuevamente con tres dígitos consecutivos.\n",
    "- [-\\s]?: Al igual que antes, esto permite un guión o un espacio en blanco, pero es opcional.\n",
    "- \\d{4}: Esto coincide con cuatro dígitos consecutivos.\n",
    "- $: Esto indica que la coincidencia debe finalizar al final de la cadena de texto."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
