Bagaimana cara mendapatkan posisi karakter dalam Python?

527

Bagaimana saya bisa mendapatkan posisi karakter di dalam string dengan python?

pengguna244470
sumber

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.

Eli Bendersky
sumber
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]

Salvador Dali
sumber
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'
ghostdog74
sumber
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('.')]
A.Joly
sumber
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
DimSarak
sumber
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.

John Machin
sumber
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]
itu Subas
sumber
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]
pylang
sumber
0

Solusi dengan numpy untuk akses cepat ke semua indeks:

string_array = np.array(list(my_string))
char_indexes = np.where(string_array == 'C')
Seb
sumber
4
Tolong jangan gunakan metode ini. Tidak ada alasan untuk membawa numpy ke dalam operasi pengindeksan string sederhana.
Mike Holler