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


528

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

Respuestas:


699

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

Utilizando 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 "<stdin>", line 1, in <module>
ValueError: substring not found

Del manual de Python

string.find(s, sub[, start[, end]])
Devuelve el índice más bajo en s donde se encuentra la subcadena sub, de modo que sub está totalmente contenida en s[start:end]. Retorno -1al fracaso. Los valores predeterminados para el inicio y el final y la interpretación de los valores negativos son los mismos que para los sectores.

Y:

string.index(s, sub[, start[, end]])
Me gusta find()pero aumenta ValueErrorcuando no se encuentra la subcadena.


127

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]

que volverá [4, 9]


44
En python3, aparece un error de sintaxis: ¿cómo debería modificarse?
Sean

19
@Sean: se eliminó la declaración de impresión. Solo queda la forma de la función. Irritante, pero la respuesta es simplemente cambiar esa línea final a: print( [pos for pos, char in enumerate(s) if char == c])
The Nate

3
foo = ( [pos for pos, char in enumerate(s) if char == c])pondrá las coordenadas foo en un formato de lista. Me parece muy útil
3nrique0

es 0 indexado, 0123 en lugar de 1234, por lo que la posición real es 5, 10
3kstc

¿Es eso tan rápido como puede ser? si uno usara np.arrays, ¿podría haber una ganancia en el rendimiento para str largos?
Seb

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

Camino "largo aliento"

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

para obtener la subcadena,

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

1
Gracias Dime cómo podemos obtener la subcadena de una cadena de acuerdo con las posiciones dadas ...
user244470

1
@arung: para obtener la subcadena, utilice el corte: str[from:to]dónde fromy cuáles toson los índices
Eli Bendersky

s.find () return -1 si no se encuentra la subcadena
Evgenii

s.search () genera un ValueError cuando no se encuentra la subcadena. s.find () devuelve -1 si no se encuentra la subcadena.
Praxiteles

16

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, uso lo siguiente, que funciona sea cual sea el nombre completo del archivo:

filename_without_extension = complete_name[:complete_name.rfind('.')]

Esto es útil para encontrar la extensión de una cadena. Por ejemplo, la búsqueda de un diccionario puede ser: left = q.find("{"); right = q.rfind("}").
ximiki

15

¿Qué sucede cuando la cadena contiene un carácter duplicado? Desde mi experiencia con index()Vi que por duplicado obtienes 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

enumeratees mejor para ese tipo de cosas.
o11c

10
string.find(character)  
string.index(character)  

Quizás le gustaría echar un vistazo a la documentación para saber cuál es la diferencia entre los dos.


A partir de esa documentación vinculada: s.search () genera un ValueError cuando no se encuentra la subcadena. s.find () devuelve -1 si no se encuentra la subcadena.
Praxiteles

7

Un personaje puede aparecer varias veces en una cadena. Por ejemplo, en una cadena sentence, la posición de ees 1, 4, 7(porque la indexación generalmente comienza desde cero). pero lo que encuentro son ambas funciones find()y index()devuelve 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]

1

more_itertools.locate es una herramienta de terceros que encuentra todas las indicaciones 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]

0

Una solución con numpy para un acceso rápido a todos los índices:

string_array = np.array(list(my_string))
char_indexes = np.where(string_array == 'C')

44
Por favor no use este método. No hay razón para incluir numpy en una simple operación de indexación de cadenas.
Mike Holler
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.