viernes, 27 de abril de 2018

Receta Python 3 No. 2-19: Escribir un Parser Recursivo

1. Problema

Parsear un texto conforme a unas reglas gramaticales.

2. Solución

Las reglas de la gramática para parsear el texto se especifican en BNF o EBNF.


Para el caso de expresiones aritméticas se puede tener una gramática como esta:
Gramática
Figura 1. Gramática parser.

3. Código Python 3

Para este ejemplo se usa la versión original del parser creado por Beazly y Jones (2013):


Archivo Python parser.py  [enlace alternativo]:


La clase ExpressionEvaluator (líneas 32-103) se encarga de crear el parser. Se apoya en el método generate_tokens() (líneas 24-29), el cual particiona o genera los tokens de la expresión dada. La invocación de este método se realiza por medio del método parse() (líneas 41-46).

Continuando, otros métodos sobresalientes son:

  • expr() (líneas 67-78): aplica la regla de expresiones de la aritmética; en este caso la suma y la resta.
  • term() (líneas 80-91): se encarga de reconocer los términos de la expresión.
  • factor() (líneas 93-103): reconoce las expresiones como números (literales) o expresiones encerradas entre paréntesis.
Prueba de ejecución:

2
5
14
37
('+', 2, 3)
('+', 2, ('*', 3, 4))
('+', 2, ('*', ('+', 3, 4), 5))
('+', ('+', 2, 3), 4)

4. Literatura & Enlaces

Beazly D, Jones B. K. (2013). Python Cookbook, Third Edition. United States: O'Reilly Media.

O

jueves, 26 de abril de 2018

Receta Python 3 No. 2-18: Tokenizar Texto

1. Problema

Parsear una cadena de texto para obtener las partes integrales.

2. Solución

Por medio de expresiones regulares es posible establecer un mecanismo de tokenización  de texto (Beazly, Jones, 2013).

3. Código Python 3

Se parte de una cadena de caracteres que representa una sentencia en Python:

texto = "resultado = 13 + 43 * 5"


Luego se pretente generar las partes integrales de esa sentencia identificando operandos, operadores, variables, etc. Al final se pretende tener algo como esto:

tokens = [('NOMBRE', 'resultado'), ('EQUAL', '='), ('OPERANDO', '13'), ('SUMA', '+'), ('NUMERO', '43'), ('PRODUCTO', '*'), ('NUMERO', '5')]

Archivo Python tokenizar-texto.py [enlace alternativo]:

Prueba de ejecución:

<_sre.SRE_Match object; span=(0, 8), match='variable'>

4. Literatura & Enlaces

Beazly D, Jones B. K. (2013). Python Cookbook, Third Edition. United States: O'Reilly Media.

O

miércoles, 25 de abril de 2018

Receta Python 3 No. 2-17: Manipular Entidades HTML y XML dentro de un Texto

1. Problema

Reemplazar entidades HTML o XML por las representacionese textuales.

2. Solución

El módulo html provee la funcionalidad requerida a través del método escape().

3. Código Python 3


Prueba de ejecución:

<strong>Python</strong> es un lenguaje de programación <em>interpretado</em>


<strong>Python</strong> es un lenguaje de programación <em>interpretado</em>

4. Literatura & Enlaces

Beazly D, Jones B. K. (2013). Python Cookbook, Third Edition. United States: O'Reilly Media.

O

martes, 24 de abril de 2018

Receta Python 3 No. 2-16: Formatear el Texto de un Número Particular de Columnas

1. Problema

Formatear el texto de un número concreto de columnas.

2. Solución

El módulo textwrap provee funcionalidad para formatear y reformatear el texto hasta un número concreto de columnas (Beazly, Jones, 2013).

3. Código Python 3


Prueba de ejecución:

A las demás personas que estaban en la taberna, sin excluir al tabernero, las
miraba con un gesto de desagrado, con una especie de altivo desdén, como a
personas que considerarse de una esfera y de una educación inferiores para que
mereciesen que él les dirigiera la palabra.

A las demás personas que estaban en la
taberna, sin excluir al tabernero, las
miraba con un gesto de desagrado, con
una especie de altivo desdén, como a
personas que considerarse de una esfera
y de una educación inferiores para que
mereciesen que él les dirigiera la
palabra.

    A las demás personas que estaban en
la taberna, sin excluir al tabernero,
las miraba con un gesto de desagrado,
con una especie de altivo desdén, como a
personas que considerarse de una esfera
y de una educación inferiores para que
mereciesen que él les dirigiera la
palabra.

A las demás personas que estaban en la
    taberna, sin excluir al tabernero,
    las miraba con un gesto de
    desagrado, con una especie de altivo
    desdén, como a personas que
    considerarse de una esfera y de una
    educación inferiores para que
    mereciesen que él les dirigiera la
    palabra.

4. Literatura & Enlaces

Beazly D, Jones B. K. (2013). Python Cookbook, Third Edition. United States: O'Reilly Media.

O

lunes, 23 de abril de 2018

Receta Python 3 No. 2-15: Interpolar Variables en Cadenas de Caracteres

1. Problema

Interpolar variables en cadenas de caracteres.

2. Solución

En Python la interporlación de cadenas de caracteres funciona a partir de la expresión {nombre_variable}. Dentro de estos caracteres se especifica un nombre de variable que contendrá el valor a sustituir (Beazly, Jones, 2013).

3. Código Python 3

python = '¡{lenguaje} es {expresion}!'

print(python.format(lenguaje='Python', expresion='genial'))

Prueba de ejecución:


¡Python es genial!

4. Literatura & Enlaces

Beazly D, Jones B. K. (2013). Python Cookbook, Third Edition. United States: O'Reilly Media.

O

domingo, 22 de abril de 2018

Receta Python 3 No. 2-14: Combinar y Concatenar Cadenas de Caracteres

1. Problema

Combinar y concatenar cadenas de caracteres.

2. Solución

El método join() permite concatenar un grupo de cadenas de caracteres en uno solo (Beazly, Jones, 2013).


La concatenación se puede realizar también con el operador + y el método format().

3. Código Python 3


Prueba de ejecución:


Python es un lenguaje de programación interpretado
Python es un lenguaje de programación interpretado

4. Literatura & Enlaces

Beazly D, Jones B. K. (2013). Python Cookbook, Third Edition. United States: O'Reilly Media.

O

sábado, 21 de abril de 2018

Receta Python 3 No. 2-13: Alinear Cadenas de Caracteres

1. Problema

Alinear cadena de caracteres.

2. Solución

Las cadenas de caracteres cuentan con los métodos ljust(), rjust() y center() se usan para la alineación de texto.

3. Código Python 3


Prueba de ejecución:


OrtizOL             
             OrtizOL
      OrtizOL       

OrtizOL*************
*************OrtizOL

******OrtizOL*******

Esta tarea también se puede realizar con el método format(). Éste recibe como parámetros el texto a alinear y el tipo de alineación: %lt; (izquierda), %gt; "derecha", y ^ (centro).

4. Literatura & Enlaces

Beazly D, Jones B. K. (2013). Python Cookbook, Third Edition. United States: O'Reilly Media.

O

viernes, 20 de abril de 2018

Receta Python 3 No. 2-12: Limpiar y Asegurar Texto

1. Problema

Limpiar y asegurar (sanitize) texto.

2. Solución

Existen soluciones básicas para la limpieza y aseguramiento de texto:
  • upper(),
  • lower(),
  • replace(),
  • re.sub()
Incluso se puede usar data.normalize(). Pero se puede ir más allá en este proceso y usar el método str.translate(). Este método recibe como parámetro un mapa para realizar cambios de caracteres en un texto (Beazly, Jones, 2013).

3. Código Python 3


Prueba de ejecución:


pýtĥöñ is awesome

pýtĥöñ is awesome

pýtĥöñ is awesome


python is awesome

4. Literatura & Enlaces

Beazly D, Jones B. K. (2013). Python Cookbook, Third Edition. United States: O'Reilly Media.

O

jueves, 19 de abril de 2018

Receta Python 3 No. 2-11: Remover Caracteres de un Texto

1. Problema

Remover caracteres particulares de una cadena de caracteres.

2. Solución

Por medio de los métodos strip(), lstrip() y rstrip() es posible remover caracteres particulares de un texto. En su defecto, remueven caracteres de espacio al inicio y al final.


Esta tarea también se puede lograr por el método replace() y sub() (este último perteneciente al módulo re) (Beazly, Jones, 2013).

3. Código Python 3


Prueba de ejecución:


OrtizOL Blog
OrtizOL Blog   
  
    OrtizOL Blog
OrtizOLBlog


 OrtizOL Blog 

4. Literatura & Enlaces

Beazly D, Jones B. K. (2013). Python Cookbook, Third Edition. United States: O'Reilly Media.

O

miércoles, 18 de abril de 2018

Receta Python 3 No. 2-10: Usar Caracteres Unicode en Expresiones Regulares

1. Problema

Usar caracteres Unicode en expresiones regulares para el procesamiento de texto.

2. Solución

El módulo re permite la especificación de caracteres Unicode para la búsqueda de coincidencias en texto. Para caracteres ASCII se puede utilizar el token \d+. Pero en el caso de dígitos arábigos es posible especificar códigos Unicode; por ejemplo:

\u0661
\u0662
\u0663

3. Código Python 3


Prueba de ejecución:

<_sre.SRE_Match object; span=(0, 3), match='987'>
<_sre.SRE_Match object; span=(0, 3), match='١٢٣'>


Ambos resultados muestran la detección del contenido de las cadenas en ASCII y con códigos Unicode.

4. Literatura & Enlaces

Beazly D, Jones B. K. (2013). Python Cookbook, Third Edition. United States: O'Reilly Media.

O

martes, 17 de abril de 2018

Receta Python 3 No. 2-9: Normalizar Texto Unicode a una Representación Estándar

1. Problema

Asegurar que cadenas de caracteres Unicode tengan la misma representación subyacente para operaciones comunes (e.g., comparación).

2. Solución

Los caracteres de un texto se pueden representar con códigos del estándar Unicode. Por ejemplo, la letra ñ, como en la palabra niño, se puede representar de estas dos formas:

\u00f1
\u0303


La primera forma (U+00F1) se refiere a la letra ñ compuesta; mientras que la segunda (U+F0303) es el símbolo de crema ~ antecedido por la letra n.


Sin embargo, esto significa un problema pues al comparar dos cadenas con esos dos caracteres el resultado de la evaluación es False.

3. Código Python 3


Prueba de ejecución:

False
True

4. Literatura & Enlaces

Beazly D, Jones B. K. (2013). Python Cookbook, Third Edition. United States: O'Reilly Media.

O

domingo, 15 de abril de 2018

Receta Python 3 No. 2-8: Escribir una Expresión Regular para Múltiples Patrones

1. Problema

Escribir una expresión regular para representar múltiples patrones.

2. Solución

El método findall() facilita hallar todas las coincidencias en una cadena caracteres. A partir de una expresión regular inclusive se puede especificar diferentes patrones de búsqueda (Beazly, Jones, 2013)

3. Código Python 3


Prueba de ejecución:


[' Comentario en Java.']
[]
['Comentario multilínea\nJava.']

4. Literatura & Enlaces

Beazly D, Jones B. K. (2013). Python Cookbook, Third Edition. United States: O'Reilly Media.

O

sábado, 14 de abril de 2018

Receta Python 3 No. 2-7: Usar una Expresión Regular para Encontrar la Coincidencia más Pequeña

1. Problema

Usar una expressión regular para encontrar la coincidencia más corta o pequeña en una cadena de texto a partir de un patrón.

2. Solución

Se puede utilizar una expresión regular que incluya el operador ?. Este operador antecedido por el operador * convierte a la expresión regular en no-greedy (no avariciosa). Con no-greedy se quiere dar a entender que la coincidencia será la cadena más corta (Beazly, Jones, 2013).

3. Código Python 3


Prueba de ejecución:

['génial']

['génial', 'machine learning']

4. Literatura & Enlaces

Beazly D, Jones B. K. (2013). Python Cookbook, Third Edition. United States: O'Reilly Media.

O

viernes, 13 de abril de 2018

Receta Python 3 No. 2-6: Buscar y Reemplazar Texto sin Considerar Capitalización

1. Problema

Buscar y reemplazar texto sin tener en cuenta la capitalización.

2. Solución

El módulo re cuenta con la bandera (o centinela) IGNORECASE para la búsqueda y reemplazo ignorando la capitalización del texto (Beazly, Jones, 2013). Esta bandera se puede utilizar en los métodos findAll y sub.

3. Código Python 3


Prueba de ejecución:

['PYTHON', 'python', 'Python']
pitón, pitón, pitón

4. Literatura & Enlaces

Beazly D, Jones B. K. (2013). Python Cookbook, Third Edition. United States: O'Reilly Media.

O

jueves, 12 de abril de 2018

Receta Python 3 No. 2-5: Buscar y Reemplazar Texto

1. Problema

Buscar y reemplazar texto en una cadena de caracteres por medio de un patrón de texto.

2. Solución

Estas operaciones se pueden realizar con los métodos replace() (string) y sub() del módulo re (Beazly, Jones, 2013).

3. Código Python 3


Prueba de ejecución:

Python es un lenguaje de programación interpretado
Hoy es 2017-12-04. Fin recetas Python 2018-13-01

4. Literatura & Enlaces

Beazly D, Jones B. K. (2013). Python Cookbook, Third Edition. United States: O'Reilly Media.

O

miércoles, 11 de abril de 2018

Receta Python 3 No. 2-4: Búsqueda y Coincidencia con Patrones de Texto

1. Problema

Coincidir o búscar texto con un patón específico.

2. Solución

El módulo re provee el método match para la coincidencia de un patrón. Por otra parte con el método find (string) se realiza la búsqueda de un texto dentro de una cadena de caracteres (Beazly, Jones, 2010).

3. Código Python 3


Prueba de ejecución:

28
Coincide

4. Literatura & Enlaces

Beazly D, Jones B. K. (2013). Python Cookbook, Third Edition. United States: O'Reilly Media.

O

martes, 10 de abril de 2018

Receta Python 3 No. 2-3: Comprobar Coincidencia de Cadenas de Caracteres usando Patrones de Comodín de Shell

1. Problema

Comprobar la coincidencia de una cadena de caracteres por medio de patrones de comedín del shell UNIX.

2. Solución

El shell de UNIX permite hacer selecciones de elementos a través de patrones; por ejemplo: *.py, Inventario[0-9]*.csv, codigo-*.py, etc.


Para lo anterior, Python cuenta con el módulo fnmath y las funciones fnmatch y fnmatchcase para la comprobación de coincidencia de cadenas (Beazly, Jones, 2013).

3. Código Python 3


Prueba de ejecución:

True
True
True
['Datos2017.csv', 'Datos1999.csv']

4. Literatura & Enlaces

Beazly D, Jones B. K. (2013). Python Cookbook, Third Edition. United States: O'Reilly Media.

O

domingo, 8 de abril de 2018

Receta Python 3 No. 2-2: Comprobar Coincidencia de Texto al Inicio o al Final de una Cadena

1. Problema

Comprobar la coincidencia en un texto al inicio o al final de la cadena de caracteres: como el caso de una extensión de un nombre de archivo o la dirección URL de un recurso.

2. Solución

Los métodos startswidth() y endswith() permiten comprobar si una cadena de caracteres empieza o termina con un texto arbitrario (Beazly, Jones, 2013).

3. Código Python 3


Prueba de ejecución:

True
True

True



Esto también se puede lograr por medio de slicing pero no resulta práctico; por ejemplo, si se quisiera comprobar la extensión de un archivo:

nombre_archivo = "python-ejemplo.py"
print(nombre_archivo[-3:] == '.py')


Es preferible optar por un enfoque declarativo en lugar de imperativo.

4. Literatura & Enlaces

Beazly D, Jones B. K. (2013). Python Cookbook, Third Edition. United States: O'Reilly Media.

O

sábado, 7 de abril de 2018

Receta Python 3 No. 2-1: Separar las Partes de una Cadena de Caracteres usando Diferentes Separadores

1. Problema

Separar las partes de una cadena de caracteres usando diferentes separadores.

2. Solución

El método split() de un objeto string aunque permite hacer separación de los elementos (partes) de una cadena de caracteres no brinda un nivel de flexibilidad como el método re.split(): múltiples separadores pueden ser establecidos como expresiones regulares (Beazly, Jones, 2013).

3. Código Python 3


Prueba de ejecución:


['Python', 'x86', 'Multiparadigma', 'Interpretado', 'Modular', 'x64']

4. Literatura & Enlaces

Beazly D, Jones B. K. (2013). Python Cookbook, Third Edition. United States: O'Reilly Media.

O

viernes, 6 de abril de 2018

Receta Python 3 No. 1-20: Combinar Múltiples Diccionarios en uno Solo

1. Problema

Se cuenta con múltiples diccionarios que requiren ser combinados en uno solo; esto con el propósito de realizar operaciones de localización de elementos o comprobación de la existencia de una llave en un único diccionario.

2. Solución

El módulo collections cuenta con la clase ChainMap que permite mapear dos diccionarios en uno sólo (Beazly, Jones, 2013).

Este proceso también se puede realizar con el método update(): con una instancia de dict() es posible combinar los elementos actuales con elementos de otro diccionario.


diccionario1 = {'x': 3, 'z': 5}
diccionario2 = {'y': 7, 'z': 11}

diccionario_combinado = dict(diccionario2)
diccionario_combinado.update(diccionario1)

3. Código Python 3


Prueba de ejecución:

3
7
5

4. Literatura & Enlaces

Beazly D, Jones B. K. (2013). Python Cookbook, Third Edition. United States: O'Reilly Media.

O

jueves, 5 de abril de 2018

Receta Python 3 No. 1-19: Transformar y Reducir Datos al Mismo Tiempo

1. Problema

Aplicar una función reducción -e.g., min(), max(), sum()-, pero primero transformar o filtrar los datos.

2. Solución

Python cuentan con expressiones generadoras que son usadas como argumentos en funciones reductoras (Beazly, Jones, 2013).

3. Código Python 3


Prueba de ejecución:

377

Existen archivos Python en el directorio dado.


Python,3.5,x64


En las líneas 22 y 23 se emula la concatenación para una archivo de texto tipo CSV.

4. Literatura & Enlaces

Beazly D, Jones B. K. (2013). Python Cookbook, Third Edition. United States: O'Reilly Media.

O

miércoles, 4 de abril de 2018

Receta Python 3 No. 1-18: Mapear Nombres a Elementos de una Secuencia

1. Problema

Mepar nombres a los elementos de una secuencia: evitar el acceso basado en posición.

2. Solución

El método namedtuple() (módulo collections) permite nombrar los elementos de una secuencia para facilitar su acceso (Beazly, Jones, 2013).

3. Código Python 3


Prueba de ejecución: 

balzac@gmail.fr
1799-05-20

4. Literatura & Enlaces

Beazly D, Jones B. K. (2013). Python Cookbook, Third Edition. United States: O'Reilly Media.

O