Bagaimana cara mendapatkan posisi karakter dalam Python?


Jawaban:


697

Ada dua metode string untuk ini, find()dan index(). Perbedaan antara keduanya adalah apa yang terjadi ketika string pencarian tidak ditemukan. find()kembali -1 dan index()menaikkan ValueError.

Menggunakan find()

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

Menggunakan 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

Dari manual Python

string.find(s, sub[, start[, end]])
Kembalikan indeks terendah dalam s di mana sub substring ditemukan sedemikian sehingga sub sepenuhnya terkandung dalam s[start:end]. Pengembalian -1gagal. Default untuk awal dan akhir dan interpretasi nilai-nilai negatif sama dengan irisan.

Dan:

string.index(s, sub[, start[, end]])
Suka find()tetapi naikkan ValueErrorketika substring tidak ditemukan.


127

Hanya demi kelengkapan, jika Anda perlu menemukan semua posisi karakter dalam sebuah string, Anda dapat melakukan hal berikut:

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

yang akan kembali [4, 9]


4
Dalam python3, saya mendapatkan kesalahan sintaksis - bagaimana ini harus dimodifikasi?
Sean

19
@Sean: pernyataan cetak telah dihapus. Hanya bentuk fungsi yang tersisa. Menjengkelkan, tetapi jawabannya hanya mengubah baris terakhir menjadi: print( [pos for pos, char in enumerate(s) if char == c])
The Nate

3
foo = ( [pos for pos, char in enumerate(s) if char == c])akan meletakkan koordinat foo dalam format daftar. Saya merasa ini sangat membantu
3nrique0

itu 0 diindeks, 0123 sebagai lawan 1234, jadi posisi sebenarnya adalah 5, 10
3kstc

Apakah itu secepat mungkin? jika satu np.arrays digunakan bisa ada keuntungan dalam kinerja untuk str lama?
Seb

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

Cara "Panjang lebar"

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

untuk mendapatkan substring,

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

1
Terima kasih Katakan padaku bagaimana kami bisa mendapatkan substring string sesuai dengan posisi yang diberikan ...
user244470

1
@ungung: untuk mendapatkan penggunaan substring slicing: str[from:to]where fromand toare indexes
Eli Bendersky

s.find () return -1 jika substring tidak ditemukan
Evgenii

s.search () memunculkan ValueError ketika substring tidak ditemukan. s.find () mengembalikan -1 jika substring tidak ditemukan.
Praxiteles

16

Hanya untuk penyelesaian, dalam hal saya ingin mencari ekstensi dalam nama file untuk memeriksanya, saya harus mencari yang terakhir '.', Dalam hal ini gunakan rfind:

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

dalam kasus saya, saya menggunakan yang berikut ini, yang berfungsi apa pun nama file lengkapnya adalah:

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

Ini berguna untuk menemukan sejauh mana string. Misalnya, menemukan kamus bisa: left = q.find("{"); right = q.rfind("}").
ximiki

15

Apa yang terjadi ketika string berisi karakter duplikat? dari pengalaman saya dengan index()saya melihat bahwa untuk duplikat Anda mendapatkan kembali indeks yang sama.

Sebagai contoh:

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

akan kembali:

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

Dalam hal ini Anda dapat melakukan sesuatu seperti itu:

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

enumeratelebih baik untuk hal semacam itu.
o11c

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

Mungkin Anda ingin melihat dokumentasi untuk mencari tahu apa perbedaan antara keduanya.


Dari dokumentasi yang ditautkan: s.search () memunculkan ValueError ketika substring tidak ditemukan. s.find () mengembalikan -1 jika substring tidak ditemukan.
Praxiteles

7

Karakter mungkin muncul beberapa kali dalam sebuah string. Misalnya dalam string sentence, posisi eis 1, 4, 7(karena pengindeksan biasanya dimulai dari nol). tetapi apa yang saya temukan adalah kedua fungsi find()dan index()mengembalikan posisi pertama karakter. Jadi, ini bisa diselesaikan dengan melakukan ini:

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 adalah alat pihak ketiga yang menemukan semua indeks item yang memenuhi syarat.

Di sini kita menemukan semua lokasi indeks surat itu "i".

import more_itertools as mit


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

0

Solusi dengan numpy untuk akses cepat ke semua indeks:

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

4
Tolong jangan gunakan metode ini. Tidak ada alasan untuk membawa numpy ke dalam operasi pengindeksan string sederhana.
Mike Holler
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.