Saltar al contenido

Función contains en string: ¿existe en Python?

Función contains de string en Python

Esta es una de las dudas más comunes en Python, acerca de la posible función contains de los strings o cadenas de texto.

En Python, la función contains para saber si una cadena de texto se encuentra dentro de otra existe como método reservado __contains__ de la clase string y no debe invocarse directamente. Se puede usar el operador in de esta manera: a in cadena que devolverá True si a está contenido en cadena.

Así pues, como te acabo de resumir, la función contains existe pero no se debe usar. Las clases en Python pueden definir un método o función __contains__ que determina cómo funciona el operador in con los objetos de esa clase. Te lo explico más adelante.

El operador in en Python

El operador in nos permite determinar si un elemento se encuentra dentro de un conjunto de elementos. Como conjunto de elementos podemos entender una lista, una tupla, un set, un diccionario, pero también una cadena de texto, pues es un conjunto de caracteres y otras subcadenas de texto.

Así pues, la mejor manera de realizar un contains en Python es preguntar si un carácter o subcadena se encuentra dentro de otra de esta forma: subcadena in cadena. Veamos algunos ejemplos en una consola de Python:

>>> 'a' in 'abcdefg'
True
>>> 'Código' in 'Código Pitón'
True
>>> 'mera' in 'esmeralda'
True
>>> 'lápiz' in 'orquesta'
False
>>> 'doce' in 'Docena'
False

Como puedes ver arriba, el operador in nos devuelve un valor booleano indicándonos si el término a la izquierda del operador se encuentra contenido en el término de la derecha.

Recuerda que, al distinguir entre minúsculas y mayúsculas, la expresión 'doce' in 'Docena' devolverá False.

También puedes utilizar not si lo que te interesa es comprobar si una cadena no está contenida dentro de otra. Además puedes usarlo de dos maneras diferentes: delante de toda la expresión o justo antes del in, cosa que resulta más legible, al menos para mí, not in:

>>> not 'z' in 'abc'
True
>>> 'z' not in 'abc'
True
>>> not 'doce' in 'Docena'
True
>>> 'doce' not in 'Docena'
True

Gracias a obtener valores booleanos podemos utilizar esta expresión fácilmente en un condicional para que nuestro código haga una cosa u otra en función de si la subcadena está contenida en otra o no. Lo vemos con un par de ejemplos:

if 'mera' in 'esmeralda':  # esto nos devolverá True
    print('mera existe en esmeralda.')
else:
    print('mera no existe en esmeralda.')

print()

if 'doce' in 'Docena':  # esto nos devolverá False
    print('doce existe en Docena.')
else:
    print('doce no existe en Docena.')

print()

# Veamos ahora un ejemplo con variables

subcadena = 'cde'
cadena = 'abcdefg'

if subcadena in cadena:  # esto devolverá True
    print(f'{cadena} contiene a {subcadena}.')
else:
    print(f'{cadena} no contiene a {subcadena}.')

El resultado será el siguiente:

15 conceptos fundamentales que necesitas conocer para aprender y dominar Python

Te voy a hacer dos regalos (no uno, sino dos) que hablan de estos 15 conceptos fundamentales de Python: mi Tutorial Básico Interactivo de Python y una cheat sheet de Python en español: La Hoja de Referencia de Python.

Estos regalos son exclusivos para los suscriptores de Código Pitón.

👍 Quiero suscribirme y mis dos regalos

mera existe en esmeralda.
doce no existe en Docena.
abcdefg contiene a cde.

Ya ves que es muy sencillo de usar. Es más, gracias al uso de in queda un código mucho más limpio y legible, al estilo Python que si tuviéramos que usar una función al uso de la forma cadena.contains(subcadena).

Desde luego, el operador in es una punto positivo para Python. ¡Y recuerda que también puedes usarlo con listas, tuplas, diccionarios, etc.!

La función __contains__ en Python

Como ya dije, el método contains sí que existe en Python. Pero no se llama de esa manera, sino que se llama __contains__.

En Python, aquellos métodos que comienzan y terminan con doble subrayado __ son funciones reservadas, con un comportamiento especial, y que se pueden redefinir si hace falta.

Algunos ejemplos muy conocidos de métodos de este tipo son:

  • __init__, que se usa como constructor de una clase.
  • __str__, es usado para definir qué se mostrará por pantalla cuando un objeto es pasado como parámetro a la función print.
  • __call__, que se usa para hacer que un objeto sea invocable.

Lo mismo sucede con __contains__, es un método reservado que se encarga de definir el comportamiento del operador in cuando se utiliza con un objeto. Es decir, cuando se usa in con un string, internamente se hace una llamada al método __contains__ definido e implementado en la clase string.

Esta función podría utilizarse de la siguiente manera. Pero recuerda, ¡no debe ser usado así, hay que usar el operador in!

>>> 'esmeralda'.__contains__('mera')
True
>>> 'Docena'.__contains__('doce')
False

No vamos a ver cómo se define e implementa el método __contains__ porque no es el objetivo de este artículo.

Cadena contenido al principio o al final de otra

Una pequeña variación muy interesante de contains sería el poder conocer si una cadena de texto contiene a otra pero justo al principio o justo al final, es decir, comprobar si una cadena empieza o termina por otra. O dicho de otro modo, si una cadena es prefijo o sufijo de otra.

Para eso, Python nos brinda dos funciones que son startswith y endswith y que se usan de la siguiente forma:

>>> 'esmeralda'.startswith('esm')
True
>>> 'esmeralda'.startswith('mer')
False
>>> 'Código Pitón'.endswith('Pitón')
True
>>> 'Código Pitón'.endswith('alda')
False

Cómodo. Sencillo. Útil. ¿No crees?

Localizar la posición de una cadena de texto dentro de otra

Una vez que has determinado que una cadena de texto existe dentro de otra mediante el operador in, tal vez quieras localizar la posición en la que aparece.

Para ello puedes utilizar las funciones index o find para encontrar la primera aparición, y rindex o rfind para encontrar la última (la r, de delante del nombre de kas funciones indica que la búsqueda se realiza desde la derecha, es decir right en inglés, o al revés, reverse en inglés).

Te explico estas funciones con más detalle y con ejemplos en este artículo de substrings o subcadenas de texto en Python.

Conclusión

Bueno, espero habértelo aclarado, pero te lo resumo aquí:

  • La función contains para determinar si un string está contenido dentro de otro sí existe en Python, pero se llama __contains__ y no debe ser utilizado directamente.
  • Se puede determinar la existencia de una subcadena utilizando el operador in, o la no existencia utilizando not in.
  • Las funciones startswith y endswith nos permiten determinar si una cadena empieza o termina con otra, mientras que index, rindex, find y rfind nos ayudan a localizar su posición.

¿Te ha resultado de ayuda esta entrada? Pues suscríbete a la lista de correo de Código Pitón, y recibe consejos y trucos de Python en tu e-mail. Además conseguirás de regalo la Hoja de Referencia de Python que te ayudará mucho en tu aprendizaje.

Y gracias por compartir este artículo 🙂

Recibe contenido exclusivo y obtén gratis la Hoja de Referencia de Python.

Antes de suscribirte consulta aquí la 
Información Básica sobre Protección de Datos. Responsable de datos: Laura Otero Moreira. Finalidad de recogida y tratamiento de datos personales: enviarte boletín informativo de Python y comunicaciones comerciales. Legitimación: tu consentimiento. Destinatarios: no se ceden a terceros. Los datos se almacenan en los servidores de marketing (MailRelay). Derechos: podrás ejercer tus derechos de acceso, rectificación, limitación y supresión de datos en info @ codigopiton.com así como presentar una reclamación ante una autoridad de control. Más información: política de privacidad, encontrarás información adicional sobre la recopilación y el uso de tu información personal.

 🎁 Tutorial Básico Interactivo y La Hoja de Referencia de Python – ¡Gratis!

La Hoja de Referencia de Python - Código Pitón
¿Quieres mejorar tu Python? Recibe totalmente gratis el Tutorial Básico Interactivo de Python, la Hoja de Referencia de Python y contenido exclusivo como trucos y consejos.



Antes de suscribirte consulta aquí la Información Básica sobre Protección de Datos. Responsable de los datos: Laura Otero Moreira. Finalidad de la recogida y tratamiento de los datos personales: enviarte boletín informativo de Python y comunicaciones comerciales. Legitimación: tu consentimiento. Destinatarios: no se ceden a terceros. Los datos se almacenan en los servidores de marketing (MailRelay). Derechos: podrás ejercer tus derechos de acceso, rectificación, limitación y supresión de datos en info @ codigopiton.com así como presentar una reclamación ante una autoridad de control. Más información en nuestra política de privacidad, encontrarás información adicional sobre la recopilación y el uso de tu información personal, incluida información sobre acceso, conservación, rectificación, eliminación, seguridad y otros temas.