HOWTO · Python
Cómo encontrar todos los índices de un carácter en una cadena de Python
Podemos usar expresiones regulares, la palabra clave yield y listas por comprensión para encontrar todos los índices de un carácter dentro de una cadena en Python.
En esta página
Para encontrar todas las apariciones de un carácter en una cadena de Python, combina enumerate() con una condición y recopila los índices coincidentes. Los índices de Python empiezan en 0, así que el primer carácter está en el índice 0. Los ejemplos usan la cadena "This is a string" y buscan la letra minúscula "i". El código y las etiquetas visibles de los ejemplos se mantienen en inglés.
Encontrar todos los índices de caracteres con enumerate() y una comprensión de listas
Para una cadena y un carácter objetivo, esta comprensión de listas devuelve todos los índices coincidentes en orden. Ejecuta este ejemplo:
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
string = "This is a string"
char = "i"
indices = [index for index, character in enumerate(string) if character == char]
print(indices)
enumerate(string) proporciona un par por cada carácter: su índice y su valor. La condición conserva un índice solo cuando ese valor es igual a char, y la comprensión de listas reúne esos índices en una lista nueva. Con la entrada de ejemplo, las posiciones coincidentes son 2, 5 y 13. La búsqueda distingue entre mayúsculas y minúsculas: buscar "I" no encontraría la "i" minúscula. Si el carácter objetivo no aparece, el resultado es []. Este método suele ser la opción más clara cuando quien llama necesita todos los índices a la vez.
Generar índices coincidentes de forma diferida con yield
Un generador resulta útil cuando se quieren consumir los resultados de uno en uno o la entrada es grande. La función siguiente aplica la misma comparación y conserva el mismo orden que la comprensión de listas, pero produce cada índice a medida que avanza la iteración.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
def find_indexes(string, char):
for index, character in enumerate(string):
if character == char:
yield index
string = "This is a string"
char = "i"
indices = list(find_indexes(string, char))
print(indices)
Llamar a find_indexes(string, char) crea un generador; su cuerpo se ejecuta conforme se solicitan valores. Usa un bucle for para procesar cada índice progresivamente, o envuelve la llamada en list(...) cuando necesites la lista completa. Materializar el generador produce los mismos índices que la comprensión de listas. Si no hay coincidencias, la iteración no produce valores y list(...) devuelve []. La palabra clave yield pausa la función mientras entrega un valor a quien la llamó y luego continúa en la siguiente iteración.
Encontrar todos los índices de caracteres con expresiones regulares
En los tres métodos de este artículo, char debe ser una cadena de Python de un solo carácter. Esta condición común mantiene coherentes las comparaciones carácter por carácter y el ejemplo con expresiones regulares. Usa re.finditer() cuando la búsqueda se describa naturalmente mediante un patrón de expresión regular. Cada objeto de coincidencia proporciona su posición inicial mediante start(). Si el objetivo es un carácter literal proporcionado como dato, pásalo por re.escape(); de lo contrario, caracteres como ., * o [ podrían interpretarse como sintaxis de expresión regular en vez de buscarse literalmente.
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
import re
string = "This is a string"
char = "i"
pattern = re.escape(char)
indices = [match.start() for match in re.finditer(pattern, string)]
print(indices)
[2, 5, 13]
Escapar el objetivo es importante cuando se trata de un valor literal, sobre todo si puede contener metacaracteres de expresiones regulares. Si quieres usar un patrón intencionadamente, pásalo directamente a re.finditer() sin escaparlo. Para un solo carácter literal, enumerate() es más sencillo; las expresiones regulares son más útiles cuando la regla de coincidencia necesita funciones propias de los patrones. Los tres métodos recorren la cadena de izquierda a derecha, conservan las coincidencias repetidas y devuelven posiciones cuyo índice empieza en cero.