Saltar a contenido

string

Fork (1)

  1. Steve Johnson Unsplash

El módulo string proporciona operaciones y constantes muy útiles para manejo de cadenas de texto, además de distintas estrategias de formateado de cadenas.

Constantes

Las constantes definidas en este módulo son las siguientes:

Constante Valor
string.ascii_lowercase 'abcdefghijklmnopqrstuvwxyz'
string.ascii_uppercase 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
string.ascii_letters 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
string.digits '0123456789'
string.octdigits '01234567'
string.hexdigits '0123456789abcdefABCDEF'
string.punctuation '!"#$%&\'()*+,-./:;<=>?@[\\]^_``{|}~'
string.printable '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_``{|}~ \t\n\r\x0b\x0c'
string.whitespace ' \t\n\r\x0b\x0c'

Ejercicio

pypas   all-ascii

Plantillas

El módulo string también nos permite usar plantillas con interpolación de variables. Algo similar a los f-strings pero con otro tipo de sintaxis.

Veamos un ejemplo en el que definimos una sencilla plantilla:

>>> from string import Template#(1)!

>>> tmpl = Template('$lang is the best programming language in the $place!')#(2)!

  1. Importamos la clase Template desde el módulo.
  2. Las variables que queramos interporlar deben ir precedidas del signo dólar $

Ahora podemos aplicar la interpolación (sustitución) de variables con los valores que nos interesen:

>>> tmpl.substitute(lang='Python', place='World')#(1)!
'Python is the best programming language in the World!'

>>> tmpl.substitute({'lang': 'Python', 'place': 'World'})#(2)!
'Python is the best programming language in the World!'

  1. Podemos usar argumentos nominales.
  2. Podemos usar un diccionario.

Hay que prestar atención cuando el identificador de variable está seguido por algún carácter que, a su vez, puede formar parte del identificador. En este caso hay que utilizar llaves para evitar la ambigüedad.

En el siguiente ejemplo se muestra un ejemplo de pluralización:

>>> tmpl = Template('Congratulations! You won several ${gift}s')

>>> tmpl.substitute(gift='phone')
'Congratulations! You won several phones'

Sustitución segura

En el caso de que alguna de las variables que estamos interpolando no exista o no tenga ningún valor, obtendremos un error al sustituir:

>>> tmpl = Template('$lang is the best programming language in the $place!')

>>> tmpl.substitute(lang='Python')
Traceback (most recent call last):
  Cell In[2], line 1
    tmpl.substitute(lang='Python')
  File ~/.local/share/uv/python/cpython-3.13.2-macos-aarch64-none/lib/python3.13/string.py:121 in substitute
    return self.pattern.sub(convert, self.template)
  File ~/.local/share/uv/python/cpython-3.13.2-macos-aarch64-none/lib/python3.13/string.py:114 in convert
    return str(mapping[named])
KeyError: 'place'

Para estos casos el módulo proporciona el método self_substitute() que no emite error si alguna variable no es especificada:

>>> tmpl.safe_substitute(lang='Python')
'Python is the best programming language in the $place!'

Casos de uso

A primera vista podría parecer que este sistema de plantillas no aporta gran ventaja sobre los f-strings que ya hemos visto. Sin embargo hay ocasiones en los que puede resultar muy útil.

La mayoría de estas escenarios tienen que ver con la oportunidad de definir el «string». Si en el momento de crear la plantilla aún no están disponibles las variables de sustitución, podría interesar utilizar la estrategia que nos proporciona este módulo.

Supongamos un ejemplo en el que tenemos una estructura de «url» y queremos únicamente sustituir una parte de ella. Para no tener que repetir la cadena de texto completa en un «f-string», podríamos seguir este enfoque:

>>> from string import Template

>>> urlbase = Template('https://python.org/3/library/$module.html')

>>> for module in ('string', 're', 'difflib'):
...     url = urlbase.substitute(module=module)
...     print(url)
...
https://python.org/3/library/string.html
https://python.org/3/library/re.html
https://python.org/3/library/difflib.html