¿Cómo obtener la posición de un personaje en Python?

¿Cómo puedo obtener la posición de un personaje dentro de una cadena en python?

Hay dos métodos de cadena para esto, find() e index() . La diferencia entre los dos es lo que sucede cuando no se encuentra la cadena de búsqueda. find() devuelve -1 e index() eleva ValueError .

Usando find()

 >>> myString = 'Position of a character' >>> myString.find('s') 2 >>> myString.find('x') -1 

Utilizando index()

 >>> myString = 'Position of a character' >>> myString.index('s') 2 >>> myString.index('x') Traceback (most recent call last): File "", line 1, in  ValueError: substring not found 

Del manual de Python.

string.find(s, sub[, start[, end]])
Devuelva el índice más bajo en s donde se encuentra la subcadena sub , de manera que sub está completamente contenido en s[start:end] . Devuelve -1 en caso de fallo. Los valores predeterminados para el inicio y el final y la interpretación de los valores negativos son los mismos que para los segmentos.

Y:

string.index(s, sub[, start[, end]])
Como find() pero ValueError cuando no se encuentra la subcadena.

Solo por razones de integridad, si necesita encontrar todas las posiciones de un personaje en una cadena, puede hacer lo siguiente:

 s = 'shak#spea#e' c = '#' print [pos for pos, char in enumerate(s) if char == c] 

el cual regresará [4, 9]

 >>> s="mystring" >>> s.index("r") 4 >>> s.find("r") 4 

Camino “de largo aliento”

 >>> for i,c in enumerate(s): ... if "r"==c: print i ... 4 

para obtener subcadena,

 >>> s="mystring" >>> s[4:10] 'ring' 

¿Qué sucede cuando la cadena contiene un carácter duplicado? De mi experiencia con el index() vi que por duplicado recuperas el mismo índice.

Por ejemplo:

 s = 'abccde' for c in s: print('%s, %d' % (c, s.index(c))) 

volvería:

 a, 0 b, 1 c, 2 c, 2 d, 4 

En ese caso puedes hacer algo así:

 for i, character in enumerate(my_string): # i is the position of the character in the string 

Solo para completar, en el caso de que quiera encontrar la extensión en un nombre de archivo para verificarlo, necesito encontrar el último ‘.’, En este caso use rfind:

 path = 'toto.titi.tata..xls' path.find('.') 4 path.rfind('.') 15 

En mi caso, utilizo lo siguiente, que funciona cualquiera que sea el nombre completo del archivo:

 filename_without_extension = complete_name[:complete_name.rfind('.')] 
 string.find(character) string.index(character) 

Tal vez le gustaría echar un vistazo a la documentación para averiguar cuál es la diferencia entre los dos.

Un carácter puede aparecer varias veces en una cadena. Por ejemplo, en una sentence cadena, la posición de e es 1, 4, 7 (porque la indexación generalmente comienza desde cero). pero lo que encuentro es que las funciones find() y index() devuelven la primera posición de un personaje. Entonces, esto se puede resolver haciendo esto:

 def charposition(string, char): pos = [] #list to store positions for each 'char' in 'string' for n in range(len(string)): if string[n] == char: pos.append(n) return pos s = "sentence" print(charposition(s, 'e')) #Output: [1, 4, 7] 

more_itertools.locate es una herramienta de terceros que encuentra todos los indicios de elementos que satisfacen una condición.

Aquí encontramos todas las ubicaciones de índice de la letra "i" .

 import more_itertools as mit s = "supercalifragilisticexpialidocious" list(mit.locate(s, lambda x: x == "i")) # [8, 13, 15, 18, 23, 26, 30]