re.match
berlabuh di awal string. Itu tidak ada hubungannya dengan baris baru, jadi tidak sama dengan menggunakan ^
dalam pola.
Seperti dokumentasi re.match mengatakan:
Jika nol atau lebih karakter di
awal string cocok dengan pola ekspresi reguler, kembalikan MatchObject
instance yang sesuai . Kembali None
jika string tidak cocok dengan pola; perhatikan bahwa ini berbeda dari pencocokan panjang nol.
Catatan: Jika Anda ingin mencari kecocokan di mana saja dalam string, gunakan search()
sebagai gantinya.
re.search
mencari seluruh string, seperti dokumentasi mengatakan :
Memindai melalui string mencari lokasi di mana pola ekspresi reguler menghasilkan kecocokan, dan mengembalikan MatchObject
contoh yang sesuai . Kembali None
jika tidak ada posisi dalam string yang cocok dengan pola; perhatikan bahwa ini berbeda dari menemukan kecocokan panjang nol di beberapa titik dalam string.
Jadi, jika Anda harus mencocokkan pada awal string, atau untuk mencocokkan seluruh penggunaan string match
. Lebih cepat. Kalau tidak gunakan search
.
Dokumentasi ini memiliki bagian khusus untuk match
vs.search
yang juga mencakup string multiline:
Python menawarkan dua operasi primitif berbeda berdasarkan ekspresi reguler: match
memeriksa kecocokan
hanya pada awal string, sementara search
memeriksa kecocokan
di mana saja dalam string (ini yang dilakukan Perl secara default).
Catatan yang match
mungkin berbeda dari search
bahkan ketika menggunakan ekspresi reguler yang dimulai dengan '^'
: '^'
cocok hanya pada awal string, atau dalam
MULTILINE
mode juga segera mengikuti baris baru. Operasi " match
" hanya berhasil jika pola cocok pada awal string
terlepas dari mode, atau pada posisi awal yang diberikan oleh pos
argumen opsional terlepas dari apakah baris baru mendahuluinya.
Sekarang, cukup bicara. Saatnya melihat beberapa kode contoh:
# example code:
string_with_newlines = """something
someotherthing"""
import re
print re.match('some', string_with_newlines) # matches
print re.match('someother',
string_with_newlines) # won't match
print re.match('^someother', string_with_newlines,
re.MULTILINE) # also won't match
print re.search('someother',
string_with_newlines) # finds something
print re.search('^someother', string_with_newlines,
re.MULTILINE) # also finds something
m = re.compile('thing$', re.MULTILINE)
print m.match(string_with_newlines) # no match
print m.match(string_with_newlines, pos=4) # matches
print m.search(string_with_newlines,
re.MULTILINE) # also matches
match
daripada lebih umumsearch
? apakah itu untuk kecepatan?match
? Apakah ini manuver pintar untuk menaburkan API dengan nama yang tidak intuitif untuk memaksa saya membaca dokumentasi? Saya masih tidak akan melakukannya! Pemberontak!match
terlihat sedikitfaster
daripada pencarian saat menggunakan ekspresi reguler yang sama tetapi contoh Anda tampaknya salah berdasarkan tes kinerja: stackoverflow.com/questions/180986/…search
⇒ menemukan sesuatu di string dan mengembalikan objek yang cocok.match
⇒ menemukan sesuatu di awal string dan mengembalikan objek yang cocok.sumber
re.search
mencari es untuk pola seluruh string , sedangkanre.match
tidak tidak mencari pola; jika tidak, tidak ada pilihan lain selain mencocokkannya di awal string.sumber
fullmatch
dalam phyton 3.4)?Komentar dari @ivan_bilan di bawah jawaban yang diterima di atas membuat saya berpikir jika peretasan seperti itu benar-benar mempercepat, jadi mari kita cari tahu berapa banyak kinerja yang akan Anda dapatkan.
Saya menyiapkan suite tes berikut:
Saya membuat 10 pengukuran (1M, 2M, ..., 10M kata) yang memberi saya plot berikut:
Garis yang dihasilkan secara mengejutkan (sebenarnya tidak terlalu mengejutkan) lurus. Dan
search
fungsinya (sedikit) lebih cepat mengingat kombinasi pola khusus ini. Moral dari tes ini: Hindari mengoptimalkan kode Anda.sumber
match
fungsinya masih lebih cepat daripadasearch
fungsi jika Anda membandingkan ekspresi reguler yang sama. Anda dapat memeriksa di script Anda dengan membandingkanre.search('^python', word)
kere.match('python', word)
(ataure.match('^python', word)
yang sama tapi lebih mudah untuk memahami jika Anda tidak membaca dokumentasi dan tampaknya tidak mempengaruhi kinerja)match
fungsi ini umumnya lebih cepat. Semakinmatch
cepat ketika Anda ingin mencari di awal string, semakinsearch
cepat ketika Anda ingin mencari di seluruh string. Yang sesuai dengan akal sehat. Itu sebabnya @ivan_bilan salah - ia biasamatch
mencari di seluruh string. Itu sebabnya Anda benar - Anda biasamatch
mencari di awal string. Jika Anda tidak setuju dengan saya, cobalah mencari regex untukmatch
itu lebih cepat daripadare.search('python', word)
dan melakukan pekerjaan yang sama.re.match('python')
ini sedikit lebih cepat daripadare.match('^python')
. Itu harus.match
fungsi sedikit lebih cepat jika Anda ingin mencari di awal string (dibandingkan dengan menggunakansearch
fungsi untuk menemukan kata di awal string denganre.search('^python', word)
misalnya). Tapi saya menemukan ini aneh, jika Anda memberi tahusearch
fungsi untuk mencari di awal string, itu harus secepatmatch
fungsi.Anda dapat merujuk contoh di bawah ini untuk memahami cara kerja
re.match
dan penelitian ulangre.match
akan kembalinone
, tetapire.search
akan kembaliabc
.sumber
Bedanya,
re.match()
menyesatkan siapa pun terbiasa Perl , grep , atau sed pencocokan ekspresi reguler, danre.search()
tidak. :-)Lebih jernih, Seperti yang dikatakan John D. Cook ,
re.match()
"berperilaku seolah-olah setiap pola memiliki prapengeluaran." Dengan kata lain,re.match('pattern')
sama denganre.search('^pattern')
. Jadi itu berlabuh di sisi kiri pola. Tapi itu juga tidak menjangkar sisi kanan pola: itu masih membutuhkan penghentian$
.Terus terang mengingat hal di atas, saya pikir
re.match()
harus usang. Saya akan tertarik untuk mengetahui alasan itu harus dipertahankan.sumber
re.match berupaya mencocokkan pola di awal string . re.search mencoba untuk mencocokkan pola di seluruh string sampai menemukan kecocokan.
sumber
Jauh lebih pendek:
search
memindai seluruh string.match
hanya memindai awal string.Mengikuti Ex mengatakannya:
sumber