Python'da bir karakterin pozisyonu nasıl alınır?


527

Python'da bir dizenin içindeki bir karakterin konumunu nasıl alabilirim?

Yanıtlar:


697

Bunun için iki dize yöntemi vardır find()ve index(). İkisi arasındaki fark, arama dizesi bulunamadığında gerçekleşir. find()döner -1 ve index()yükseltir ValueError.

kullanma find()

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

kullanma 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

Gönderen Python kılavuzda

string.find(s, sub[, start[, end]])
Alt dize altının bulunacağı s cinsinden en düşük dizini , alt tümüyle içerilecek şekilde döndürün . Arıza durumunda geri dönüş . Negatif değerlerin başlangıç ve bitiş ve yorumlama varsayılanları dilimlerle aynıdır.s[start:end]-1

Ve:

string.index(s, sub[, start[, end]])
Gibi find()ama zam ValueErroralt dize bulunamadığında görüntülenen.


127

Bir tamlık uğruna, bir dizede bir karakterin tüm konumlarını bulmanız gerekiyorsa, aşağıdakileri yapabilirsiniz:

s = 'shak#spea#e'
c = '#'
print [pos for pos, char in enumerate(s) if char == c]

hangisi geri dönecek [4, 9]


4
Python3'te bir sözdizimi hatası alıyorum - bu nasıl değiştirilmelidir?
Sean

19
@Sean: print ifadesi kaldırıldı. Sadece fonksiyon formu kalır. Tahriş edici, ama cevap sadece bu son satırı değiştirmek için: print( [pos for pos, char in enumerate(s) if char == c])
Nate

3
foo = ( [pos for pos, char in enumerate(s) if char == c])foo koordinatlarını liste biçiminde koyacaktır . Bu gerçekten yararlı buluyorum
3nrique0

0 endeksli, 0123 1234 yerine, bu nedenle gerçek konum 5, 10
3kstc

olabildiğince hızlı mı? eğer biri np.arrays kullansaydı uzun str için performansta bir kazanç olabilir mi?
Seb

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

"Uzun sargılı" yol

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

alt dize almak için,

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

1
Teşekkürler Bana verilen pozisyonlara göre bir dizenin alt dize nasıl alabilirim ...
user244470

1
@arung: alt dize almak için dilimleme kullanın: str[from:to]nerede fromve toendeksler
Eli Bendersky

alt dize bulunmazsa s.find () -1 döndürür
Evgenii

s.search (), alt dize bulunamadığında bir ValueError oluşturur. Alt dize bulunmazsa s.find () -1 değerini döndürür.
Praxiteles

16

Sadece tamamlanması için, kontrol etmek için bir dosya adındaki uzantıyı bulmak istiyorum, son '.' Bulmak gerekir, bu durumda rfind kullanın:

path = 'toto.titi.tata..xls'
path.find('.')
4
path.rfind('.')
15

benim durumumda, tam dosya adı ne olursa olsun aşağıdakileri kullanıyorum:

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

Bu, bir dizenin kapsamını bulmak için yararlıdır. Örneğin, bir sözlük bulma olabilir: left = q.find("{"); right = q.rfind("}").
ximiki

15

Dize yinelenen bir karakter içerdiğinde ne olur? deneyimlerime göre index()yinelenen için aynı endeksi geri aldığını gördüm.

Örneğin:

s = 'abccde'
for c in s:
    print('%s, %d' % (c, s.index(c)))

dönecekti:

a, 0
b, 1
c, 2
c, 2
d, 4

Bu durumda böyle bir şey yapabilirsiniz:

for i, character in enumerate(my_string):
   # i is the position of the character in the string

enumeratebu tür şeyler için daha iyidir.
o11c

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

Belki de ikisi arasındaki farkın ne olduğunu öğrenmek için belgelere göz atmak istersiniz .


Bu bağlantılı belgelerden: s.search (), alt dize bulunamadığında bir ValueError oluşturur. Alt dize bulunmazsa s.find () -1 değerini döndürür.
Praxiteles

7

Bir karakter bir dizede birden çok kez görünebilir. Bir dizi Örneğin sentence, pozisyon eolan 1, 4, 7(indeksleme genellikle sıfırdan başlar için). ama ne bulmak işlevlerin hem find()ve index()bir karakterin ilk pozisyonunu döndürür. Yani, bunu yaparak çözülebilir:

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 bir koşulu karşılayan tüm öğeleri gösteren üçüncü taraf bir araçtır.

Burada mektubun tüm dizin yerlerini buluruz "i".

import more_itertools as mit


s = "supercalifragilisticexpialidocious"
list(mit.locate(s, lambda x: x == "i"))
# [8, 13, 15, 18, 23, 26, 30]

0

Tüm dizinlere hızlı erişim için numpy içeren bir çözüm:

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

4
Lütfen bu yöntemi kullanmayın. Numpy'yi basit bir dizgi indeksleme işlemine getirmek için hiçbir neden yoktur.
Mike Holler
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.