Bagaimana saya bisa memeriksa jika ada string dalam array yang ada di string lain?
Suka:
a = ['a', 'b', 'c']
str = "a123"
if a in str:
print "some of the strings found in str"
else:
print "no strings found in str"
Kode itu tidak berfungsi, hanya untuk menunjukkan apa yang ingin saya capai.
[abc]
juga bekerja dengan sangat baik dan akan lebih cepat jika ada lebih dari beberapa kandidat untuk diuji. Tetapi jika stringnya arbitrer dan Anda tidak mengetahuinya terlebih dahulu untuk membuat regex, Anda harus menggunakanany(x in str for x in a)
pendekatan tersebut.Jawaban:
Anda bisa menggunakan
any
:Demikian pula untuk memeriksa apakah semua string dari daftar ditemukan, gunakan
all
bukanany
.sumber
for x in a
seperti "untuk setiap elemen dalam daftar". Karenaa
adalah daftar string, danx
merupakan elemen dari daftar itu,x
adalah string (salah satu dari 'a', 'b', 'c' dalam contoh asli)any()
sejauh ini merupakan pendekatan terbaik jika semua yang Anda inginkan adalahTrue
atauFalse
, tetapi jika Anda ingin mengetahui secara spesifik string / string mana yang cocok, Anda dapat menggunakan beberapa hal.Jika Anda ingin kecocokan pertama (dengan
False
sebagai default):Jika Anda ingin mendapatkan semua kecocokan (termasuk duplikat):
Jika Anda ingin mendapatkan semua kecocokan non-duplikat (mengabaikan pesanan):
Jika Anda ingin mendapatkan semua kecocokan non-duplikat dalam urutan yang benar:
sumber
OrderedDict
mungkin lebih banyak performan daripada daftar. Lihat jawaban ini pada "Menghapus duplikat dalam daftar"Anda harus berhati-hati jika senar masuk
a
ataustr
semakin panjang. Solusi langsung mengambil O (S * (A ^ 2)), di manaS
panjangstr
dan A adalah jumlah panjang semua string dia
. Untuk solusi yang lebih cepat, lihat algoritma Aho-Corasick untuk pencocokan string, yang berjalan dalam waktu linear O (S + A).sumber
Untuk menambah keragaman dengan
regex
:atau jika daftar Anda terlalu panjang -
any(re.findall(r'|'.join(a), str, re.IGNORECASE))
sumber
(
atau*
ini gagal, karena mengutip untuk sintaks regex perlu dilakukan.'|'.join(map(re.escape, strings_to_match))
. Anda mungkinre.compile('|'.join(...))
juga bisa.Anda perlu mengulangi elemen a.
sumber
jbernadas sudah menyebutkan Aho-Corasick-Algorithm untuk mengurangi kompleksitas.
Berikut adalah salah satu cara untuk menggunakannya dalam Python:
Unduh aho_corasick.py dari sini
Letakkan di direktori yang sama dengan file Python utama Anda dan beri nama
aho_corasick.py
Coba aloritma dengan kode berikut:
Perhatikan bahwa pencarian peka huruf besar-kecil
sumber
sumber
Tergantung pada konteks anggaplah jika Anda ingin memeriksa satu literal seperti (kata tunggal a, e, w, .. dll) di sudah cukup
jika Anda ingin memeriksa salah satu karakter di antara original_word: manfaatkan
jika Anda ingin semua input yang Anda inginkan dalam original_word itu, gunakan semua yang sederhana
sumber
Hanya beberapa info lebih lanjut tentang cara mendapatkan semua elemen daftar yang tersedia di String
sumber
Pendekatan yang sangat cepat adalah menggunakan
set
:Ini berfungsi jika
a
tidak mengandung nilai multi-karakter (dalam hal ini digunakanany
seperti yang tercantum di atas ). Jika demikian, itu sederhana untuk menentukana
sebagai string:a = 'abc'
.sumber
sumber
Saya akan menggunakan fungsi semacam ini untuk kecepatan:
sumber
sumber