Python memiliki string.find()
dan string.rfind()
untuk mendapatkan indeks substring dalam sebuah string.
Saya bertanya-tanya apakah ada sesuatu string.find_all()
yang dapat mengembalikan semua indeks yang ditemukan (tidak hanya yang pertama dari awal atau yang pertama dari akhir).
Sebagai contoh:
string = "test test test test"
print string.find('test') # 0
print string.rfind('test') # 15
#this is the goal
print string.find_all('test') # [0,5,10,15]
'ttt'.find_all('tt')
kembali?'ttt'.rfind_all('tt')
, yang seharusnya mengembalikan '1'Jawaban:
Tidak ada fungsi string bawaan yang melakukan apa yang Anda cari, tetapi Anda bisa menggunakan ekspresi reguler yang lebih kuat :
Jika Anda ingin menemukan kecocokan yang tumpang tindih, lookahead akan melakukan itu:
Jika Anda ingin menemukan yang terbalik-semua tanpa tumpang tindih, Anda dapat menggabungkan tampilan positif dan negatif ke dalam ekspresi seperti ini:
re.finditer
mengembalikan generator , sehingga Anda dapat mengubah[]
di atas untuk()
mendapatkan generator, bukan daftar yang akan lebih efisien jika Anda hanya mengulangi hasilnya sekali saja.sumber
[m.start() for m in re.finditer('test', 'test test test test')]
, bagaimana kita bisa mencaritest
atautext
? Apakah ini menjadi jauh lebih rumit?Dengan demikian, kita dapat membangunnya sendiri:
Tidak diperlukan string atau regex sementara.
sumber
start += len(sub)
denganstart += 1
.re.findall
, saya sarankan menambahkanlen(sub) or 1
bukanlen(sub)
, jika tidak generator ini tidak akan pernah berakhir pada substring kosong.Inilah cara (yang sangat tidak efisien) untuk mendapatkan semua kecocokan (yaitu, bahkan tumpang tindih):
sumber
Sekali lagi, utas lama, tapi inilah solusi saya menggunakan generator dan polos
str.find
.Contoh
kembali
sumber
Anda dapat menggunakan
re.finditer()
untuk pertandingan yang tidak tumpang tindih.tetapi tidak akan bekerja untuk:
sumber
Ayo, mari kita kembali bersama.
Tidak perlu untuk ekspresi reguler seperti ini.
sumber
RecursionError
jika ada cukup banyak kejadian. Yang lain adalah dua daftar membuang yang dibuat pada setiap iterasi hanya untuk menambahkan satu elemen, yang sangat suboptimal untuk fungsi pencarian string, yang mungkin bisa disebut berkali-kali. Meskipun kadang-kadang fungsi rekursif tampak elegan dan jelas, mereka harus diambil dengan hati-hati.Jika Anda hanya mencari satu karakter, ini akan berhasil:
Juga,
Firasat saya adalah bahwa tidak satu pun dari ini (terutama # 2) yang sangat performant.
sumber
ini adalah utas lama tetapi saya tertarik dan ingin membagikan solusi saya.
Ini harus mengembalikan daftar posisi tempat substring ditemukan. Berikan komentar jika Anda melihat kesalahan atau ruang untuk perbaikan.
sumber
Ini melakukan trik untuk saya menggunakan re.finditer
sumber
Utas ini agak lama tetapi ini berhasil untuk saya:
sumber
Anda dapat mencoba :
sumber
Apa pun solusi yang disediakan oleh orang lain sepenuhnya didasarkan pada metode find yang tersedia () atau metode apa pun yang tersedia.
Memanggil metode
sumber
Fungsi ini tidak melihat semua posisi di dalam string, tidak membuang sumber daya komputasi. Usaha saya:
untuk menggunakannya menyebutnya seperti ini:
sumber
Saat mencari sejumlah besar kata kunci dalam dokumen, gunakan flashtext
Flashtext berjalan lebih cepat daripada regex pada daftar kata pencarian yang besar.
sumber
sumber
Ini adalah solusi dari pertanyaan serupa dari hackerrank. Saya harap ini bisa membantu Anda.
Keluaran:
sumber
Dengan mengiris kami menemukan semua kombinasi yang mungkin dan menambahkannya dalam daftar dan menemukan berapa kali itu terjadi menggunakan
count
fungsisumber
s="test test test test"
danf="test"
kode Anda dicetak4
, tetapi OP diharapkan[0,5,10,15]
silakan lihat kode di bawah ini
sumber
Cara pythonic adalah:
sumber
lambda
cara ini bukan Pythonic dan bertentangan dengan PEP8 . 3) Ini tidak memberikan output yang benar untuk situasi OPAnda dapat dengan mudah menggunakan:
https://www.programiz.com/python-programming/methods/string/count
Bersulang!
sumber