Artículo original escrito por Bala Priya C
Artículo original Python String Methods Tutorial – How to Use find() and replace() on Python Strings
Traducido y adaptado por andres-torres

Cuando trabajamos con cadenas de texto en Python, podemos necesitar buscar un patrón a en ellas, o incluso reemplazar partes de una cadena con otra sub-cadena.

Python posee dos métodos muy útiles; find() y replace() que nos ayudan a ejecutar las tareas de procesar cadenas de texto.

En este tutorial, aprenderemos acerca de estos dos métodos con ejemplos de código.

Inmutabilidad de las cadenas de texto en Python.

Las cadenas de texto en Python son inmutables. Por tanto, no podemos modificarlas.

Las cadenas son  interables en Python, y tienen cero-indexación. Los índices válidos para la longitud  n de una cadena son 0,1,2,..,(n-1).

Podemos usar indexación negativa, donde el último elemento es un índice -1, el penúltimo elemento es un índice  -2 y así sucesivamente.

Por ejemplo, tenemos  my_string que contiene la cadena de texto "writer". Intentemos cambiar esto  a "writes" agregando el carácter "s".

my_string = "writer"

Intentemos entonces, asignar la letra"s" como se muestra abajo. Mediante indexación negativa, sabemos que el índice del último carácter en my_string es -1.

my_string[-1]="s"

# Output
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-1-670491032ba6> in <module>()
      1 my_string = "writer"
----> 2 my_string[-1]="s"

TypeError: 'str' object does not support item assignment

Cómo se muestra en el código de arriba, tenemos un  TypeError. Esto es debido a que el objeto de cadena es inmutable, y la tarea que intentamos ejecutar es inválida.

Sin embargo, puede que a menudo necesitemos modificar cadenas de texto. Es en este caso que los métodos de cadena nos ayudarán.

Los métodos de cadenas operan en cadenas existentes y retornan una nueva cadena modificada.  La cadena existente no es modificada.

Pasemos a la siguiente lección para aprender más acerca de los métodos find() y replace().

Cómo usar find() para buscar patrones en cadenas de Python.

Puedes usar el método  find()  para buscar a un patrón específico en una cadena. La sintaxis general es mostrada abajo.

<this_string>.find(<this_pattern>)

La cadena que nos gustaría buscar está definida por  this_string. El patrón que nos gustaría buscar es this_pattern.

Ahora analicemos la sintaxis anterior.

  • El método find() busca a través de this_string si existe la ocurrencia de this_pattern.
  • Si this_pattern existe, entonces retorna el índice inicial de la primera ocurrencia de this_pattern.
  • Si this_pattern no está en this_string, retorna -1.

▶ Veamos algunos ejemplos.

Python método find() Ejemplos

Tomemos como ejemplo la siguiente cadena de texto "I enjoy coding in Python!".

my_string = "I enjoy coding in Python!"
my_string.find("Python")

# Output
18

En el ejemplo anterior, intentamos buscar "Python" en "my_string". El método find() retornó 18, el índice inicial del patrón "Python".

Para verificar si el índice retornado es correcto, podemos corroborar si my_string[18]=="P" es evaluado como True.

▶ Ahora, intentaremos buscar una sub-cadena que no está presente en nuestra cadena de texto original.

my_string.find("JavaScript")

# Output
-1

En este ejemplo tratamos de buscar"JavaScript" palabra que no estaba presente en nuestro enunciado. Como consecuencia el método find() ha retornado  -1, tal como se mencionó anteriormente.

Cómo usar find() para buscar patrones en sub-cadenas en Python.

Podemos usar el método find() para buscar un patrón en cierta sub-cadena o parte de cadena, en vez de buscar en toda la cadena.

En este caso, la llamada al método find() toma la siguiente forma:

<this_string>.find(<this_pattern>, <start_index>,<end_index>)

Esto funciona de manera similar a lo descrito anteriormente en la sintaxis.

La única diferencia es que la búsqueda de un patrón no se realiza sobre toda la cadena. Solo se efectúa sobre una parte de la cadena, especificada por  start_index:end_index.

Cómo usar index() para buscar por patrones en cadenas de Python.

Para buscar la ocurrencia de un patrón en una cadena, podemos usar también el método index(). Llamar a este método conlleva la sintaxis siguiente:

<this_string>.index(<this_pattern>)

El funcionamiento del método index() también es muy similar al del método find().

  • Si this_pattern está presente en this_string, el método index() retorna el índice inicial de la primera ocurrencia de this_pattern.
  • Sin embargo, genera un ValueError si this_pattern no es encontrado en this_string.

▶ Es hora de dar ejemplos.

Python ejemplos de método index()

Utilicemos la cadena my_string = "I enjoy coding in Python!" de nuestro ejemplo anterior.

my_string.index("Python")

# Output
18

En este caso, el resultado es idéntico al del método find().

Si buscamos por una sub-cadena que no está presente en nuestra cadena, el método index() proporciona un ValueError. Esto es mostrado en el siguiente código.

my_string.index("JavaScript")

# Output
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-4-377f7c374e16> in <module>()
----> 1 my_string.index("JavaScript")

ValueError: substring not found

En la siguiente sección, aprenderemos cómo encontrar y reemplazar patrones en cadenas.

Cómo usar replace() para encontrar y reemplazar patrones en cadenas de Python

Si necesitas buscar un patrón a través de una cadena, y reemplazarlo con otro patrón, entonces puedes usar el método replace(). La sintaxis general es la siguiente.

<this_string>.replace(<this>,<with_this>)

Analicemos la sintaxis.

  • El método replace() busca a través de this_string por el patrón this.
  • Si el patrón this está presente, retorna una nueva cadena de texto donde todas las ocurrencias del patrón this son reemplazadas con el patrón especificado en el artículo  with_this.
  • Si el patrón this no es encontrado en this_string, la cadena de texto a retornar será la misma que this_string.
¿Qué sucede si quieres reemplazar solo un cierto número de ocurrencias en vez de todas las ocurrencias en el patrón?

En este caso, puedes añadir un argumento opcional  en la llamada al método que especifique cuantas ocurrencias del patrón te gustaría reemplazar.

<this_string>.replace(<this>,<with_this>, n_occurrences)

En la sintaxis mostrada arriba, n_occurrences garantiza que solo las primeras t n ocurrencias del patrón son reemplazadas en la cadena a retornar.

▶ Veamos algunos ejemplos para entender cómo funciona la función replace().

Python método replace(), ejemplos

redefinamos my_string de la forma siguiente:

I enjoy coding in C++.
C++ is easy to learn.
I've been coding in C++ for 2 years now.:)

Esto es mostrado en el fragmento de código siguiente:

my_string = "I enjoy coding in C++.\nC++ is easy to learn.\nI've been coding in C++ for 2 years now.:)"

Reemplacemos todas las ocurrencias de  "C++" con "Python", de la siguiente manera:

my_string.replace("C++","Python")

# Output
'I enjoy coding in Python.\nPython is easy to learn.\nI've been coding in Python for 2 years now.:)'

Cómo el método replace() regresa una cadena, veamos los caracteres \n en el resultado. Para que el carácter \n  introduzca saltos de línea, podemos imprimir la cadena como se muestra a continuación:

print(my_string.replace("C++","Python"))


# Output
I enjoy coding in Python.
Python is easy to learn.
I've been coding in Python for 2 years now.:)

En este ejemplo, vemos que todas las ocurrencias de "C++" han sido reemplazadas con"Python".

▶ Ahora, también usaremos el argumento adicional n_occurrences.

El siguiente código retorna una cadena donde las primeras dos ocurrencias de "C++" han sido reemplazadas con "Python".

print(my_string.replace("C++","Python",2))

# Output
I enjoy coding in Python.
Python is easy to learn.
I've been coding in C++ for 2 years now.:)

El siguiente código retorna una cadena donde solo la primera ocurrencia de  "C++" es reemplazada con "Python":

print(my_string.replace("C++","Python",1))

# Output
I enjoy coding in Python.
C++ is easy to learn.
I've been coding in C++ for 2 years now.:)

▶ Ahora, intentemos reemplazar una sub-cadena "JavaScript" que no existe en my_string. Por tanto, la cadena retornada es la misma que my_string.

print(my_string.replace("JavaScript","Python"))

# Output
I enjoy coding in C++.
C++ is easy to learn.
I've been coding in C++ for 2 years now.:)

Conclusión

En este tutorial, aprendimos lo siguiente:

  • Cómo buscar a través de cadenas de texto en Python, usando los métodos find() e index(), y además...
  • Cómo encontrar y reemplazar patrones o sub-cadenas usando el método  replace()

Espero hayas disfrutado de este tutorial.

¡Feliz Aprendizaje!