Como obter a posição de um personagem em Python?

527

Como posso obter a posição de um personagem dentro de uma string em python?

user244470
fonte

Respostas:

697

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.

Usando find()

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

Usando 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

No manual do Python

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 na s[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 aumentar ValueErrorquando a substring não for encontrada.

Eli Bendersky
fonte
127

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]

Salvador Dalí
fonte
4
No python3, recebo um erro de sintaxe - como isso deve ser modificado?
27416 Sean
19
@ Sean: a declaração de impressão foi removida. Somente o formulário da função permanece. Irritante, mas a resposta é simplesmente para mudar essa linha final: print( [pos for pos, char in enumerate(s) if char == c])
O Nate
3
foo = ( [pos for pos, char in enumerate(s) if char == c])colocará as coordenadas foo em um formato de lista. Acho isso realmente útil
3nrique0
é 0 indexado, 0123 em oposição a 1234, então a posição real é 5, 10
3kstc 6/01
isso é o mais rápido que pode ser? se alguém usasse np.arrays, poderia haver um ganho no desempenho por str longo?
Seb
49
>>> 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'
ghostdog74
fonte
1
Graças Diga-me como é que podemos obter a substring de uma string de acordo com as posições dadas ...
user244470
1
@arung: para obter o corte uso substring: str[from:to]onde frome tosão índices
Eli Bendersky
s.find () -1 retorno se subsequência não é encontrado
Evgenii
s.search () gera um ValueError quando a substring não é encontrada. s.find () retorna -1 se a substring não for encontrada.
Praxiteles 29/01
16

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('.')]
A.Joly
fonte
Isso é útil para encontrar a extensão de uma string. Por exemplo, encontrar um dicionário pode ser: left = q.find("{"); right = q.rfind("}").
Ximiki #
15

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
DimSarak
fonte
enumerateé melhor para esse tipo de coisa.
o11c 02/07/2015
10
string.find(character)  
string.index(character)  

Talvez você queira dar uma olhada na documentação para descobrir qual é a diferença entre os dois.

John Machin
fonte
A partir dessa documentação vinculada: s.search () gera um ValueError quando a substring não é encontrada. s.find () retorna -1 se a substring não for encontrada.
Praxiteles
7

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]
itssubas
fonte
1

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]
pylang
fonte
0

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')
Seb
fonte
4
Por favor, não use este método. Não há razão para inserir numpy em uma operação simples de indexação de string.
Mike Holler