Como posso obter a posição de um personagem dentro de uma string em python?
Como posso obter a posição de um personagem dentro de uma string em python?
Respostas:
Existem dois métodos de string para isso, find()
e index()
. A diferença entre os dois é o que acontece quando a sequência de pesquisa não é encontrada. find()
retorna -1
e index()
aumenta ValueError
.
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]])
Retornar o menor índice de s onde a subcadeia sub se encontra de tal modo que sub está totalmente contido nas[start:end]
. Retorno-1
em caso de falha. Os padrões para início e fim e a interpretação dos valores negativos são os mesmos para as fatias.
E:
string.index(s, sub[, start[, end]])
Gostar,find()
mas aumentarValueError
quando a substring não for encontrada.
Por uma questão de integridade, se você precisar encontrar todas as posições de um personagem em uma sequência, faça o seguinte:
s = 'shak#spea#e'
c = '#'
print [pos for pos, char in enumerate(s) if char == c]
que retornará [4, 9]
print( [pos for pos, char in enumerate(s) if char == c])
foo = ( [pos for pos, char in enumerate(s) if char == c])
colocará as coordenadas foo em um formato de lista. Acho isso realmente útil
>>> s="mystring"
>>> s.index("r")
4
>>> s.find("r")
4
Maneira "muito enrolada"
>>> for i,c in enumerate(s):
... if "r"==c: print i
...
4
para obter substring,
>>> s="mystring"
>>> s[4:10]
'ring'
str[from:to]
onde from
e to
são índices
Apenas para conclusão, no caso de eu querer encontrar a extensão em um nome de arquivo, para verificar isso, preciso encontrar o último '.', Nesse caso, use rfind:
path = 'toto.titi.tata..xls'
path.find('.')
4
path.rfind('.')
15
no meu caso, uso o seguinte, que funciona independentemente do nome completo do arquivo:
filename_without_extension = complete_name[:complete_name.rfind('.')]
left = q.find("{"); right = q.rfind("}")
.
O que acontece quando a string contém um caractere duplicado? da minha experiência com index()
vi que, por duplicado, você recebe de volta o mesmo índice.
Por exemplo:
s = 'abccde'
for c in s:
print('%s, %d' % (c, s.index(c)))
retornaria:
a, 0
b, 1
c, 2
c, 2
d, 4
Nesse caso, você pode fazer algo assim:
for i, character in enumerate(my_string):
# i is the position of the character in the string
enumerate
é melhor para esse tipo de coisa.
string.find(character)
string.index(character)
Talvez você queira dar uma olhada na documentação para descobrir qual é a diferença entre os dois.
Um caractere pode aparecer várias vezes em uma sequência. Por exemplo, em uma sequência sentence
, a posição de e
é 1, 4, 7
(porque a indexação geralmente começa do zero). mas o que eu acho são as duas funções find()
e index()
retorna a primeira posição de um personagem. Portanto, isso pode ser resolvido fazendo o seguinte:
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
é uma ferramenta de terceiros que encontra todas as indicações de itens que atendem a uma condição.
Aqui encontramos todos os locais de indexação da carta "i"
.
import more_itertools as mit
s = "supercalifragilisticexpialidocious"
list(mit.locate(s, lambda x: x == "i"))
# [8, 13, 15, 18, 23, 26, 30]
Uma solução com numpy para acesso rápido a todos os índices:
string_array = np.array(list(my_string))
char_indexes = np.where(string_array == 'C')