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:
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ónprint
.__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
!
Te envío todos los días un consejo para que cada día seas mejor en Python.
Siempre sobre Python y programación.
Más de 2500 personas como tú los reciben cada día.
Día que estás fuera, consejo sobre Python que te pierdes.
Antes de suscribirte consulta aquí la
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 (GetResponse).
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.
>>> '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 utilizandonot in
. - Las funciones
startswith
yendswith
nos permiten determinar si una cadena empieza o termina con otra, mientras queindex
,rindex
,find
yrfind
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 🙂
Te envío todos los días un consejo para que cada día seas mejor en Python.
Siempre sobre Python y programación.
Más de 2500 personas como tú los reciben cada día.
Día que estás fuera, consejo sobre Python que te pierdes.
Antes de suscribirte consulta aquí la
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 (GetResponse).
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.