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-1em 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 aumentarValueErrorquando 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 frome tosã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')