¿Cómo puedo obtener la posición de un personaje dentro de una cadena en Python?
¿Cómo puedo obtener la posición de un personaje dentro de una cadena en Python?
Respuestas:
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
.
find()
>>> myString = 'Position of a character'
>>> myString.find('s')
2
>>> myString.find('x')
-1
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
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 ens[start:end]
. Retorno-1
al 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 gustafind()
pero aumentaValueError
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]
que volverá [4, 9]
print( [pos for pos, char in enumerate(s) if char == c])
foo = ( [pos for pos, char in enumerate(s) if char == c])
pondrá las coordenadas foo en un formato de lista. Me parece muy útil
>>> 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'
str[from:to]
dónde from
y cuáles to
son los índices
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('.')]
left = q.find("{"); right = q.rfind("}")
.
¿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
enumerate
es mejor para ese tipo de cosas.
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.
Un personaje puede aparecer varias veces en una cadena. Por ejemplo, en una cadena sentence
, la posición de e
es 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]
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]
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')