. = mana-mana watak * = muncul 0 kali atau lebih, bersamaan dengan {0,} ? = mengambil yang mempunyai perlawanan sebelumnya yang paling sedikit, bersamaan dengan {0,1}
Ringkasnya, ini bermaksud "mana-mana watak muncul 0 kali", jadi tiada apa-apa.
Untuk memadankan cats, anda harus menggunakan ruang selepas cats, r'(.*?) '.
Pemahaman peribadi saya ialah .*? sepadan dengan ^, iaitu kedudukan permulaan Dalam ungkapan biasa, kedudukan juga boleh dipadankan, seperti:
In [1]: s = 'a'
In [2]: re.sub(r'^','b',s)
Out[2]: 'ba'
Contoh ini menggantikan ^, dan perkara yang sama berlaku untuk $, jadi .*? anda secara langsung sepadan dengan ^. PS: Apabila menggunakan ungkapan biasa, terutamanya jika terdapat banyak kandungan teks Ia tidak disyorkan untuk menggunakan .* tetapi [sS]* atau [dD]* dsb.
Ini ialah perbezaan antara padanan tamak ungkapan biasa dan padanan tidak tamak:
Mod tamak: Apabila padanan boleh dilakukan, padankan terpanjang . Ungkapan tidak berakhir dengan ?.
Mod tidak tamak: Apabila pemadanan boleh dilakukan, padankan terpendek . Ungkapan berakhir dengan ?.
Sebagai contoh, rentetan abcabcabc, apabila saya ingin memadankan rentetan yang bermula dengan a dan berakhir dengan c, terdapat tiga padanan: abc, abcabc dan abcabcabc, antaranya yang paling Panjang abcabcabc boleh dipadankan dengan a.*c, manakala yang terpendek abc boleh dipadankan dengan a.*?c.
>>> import re
>>> line = "abcabcabc"
>>> m = re.match(r'a.*c', line)
>>> m.group()
'abcabcabc'
>>> m = re.match(r'a.*?c', line)
>>> m.group()
'abc'
Kenapa keputusan kosong? Bukankah sepatutnya kucing?
Oleh kerana .* ialah corak tamak, ia akan sepadan dengan rentetan terpanjang di mana setiap aksara ialah sebarang aksara (.), iaitu rentetan yang terdiri daripada semua aksara input. Dan .*? ialah mod tidak tamak, yang akan sepadan dengan rentetan terpendek di mana setiap aksara ialah sebarang aksara (.), iaitu rentetan kosong.
Jika anda ingin memadankan perkataan kucing, anda harus menggunakan cats. Jika anda ingin memadankan perkataan pertama dalam rentetan input, anda harus menggunakan w atau S .
Adakah terdapat aksara nol sebelum rentetan secara lalai?
Tidak, tetapi dalam ungkapan biasa, anda boleh menggunakan ^ untuk mewakili kedudukan permulaan rentetan dan $ untuk mewakili kedudukan penamat. Ambil perhatian bahawa kedua-dua aksara ini (^ dan $) ialah simbol yang ditentukan oleh peraturan yang sepadan dan digunakan dalam rentetan peraturan yang anda tulis Ini tidak bermakna rentetan yang akan dipadankan mengandungi dua simbol ini.
.
= mana-mana watak*
= muncul 0 kali atau lebih, bersamaan dengan{0,}
?
= mengambil yang mempunyai perlawanan sebelumnya yang paling sedikit, bersamaan dengan{0,1}
Ringkasnya, ini bermaksud "mana-mana watak muncul 0 kali", jadi tiada apa-apa.
Untuk memadankan
cats
, anda harus menggunakan ruang selepascats
,r'(.*?) '
.Pemahaman peribadi saya ialah
.*?
sepadan dengan^
, iaitu kedudukan permulaan Dalam ungkapan biasa, kedudukan juga boleh dipadankan, seperti:Contoh ini menggantikan
^
, dan perkara yang sama berlaku untuk$
, jadi.*?
anda secara langsung sepadan dengan^
.PS: Apabila menggunakan ungkapan biasa, terutamanya jika terdapat banyak kandungan teks Ia tidak disyorkan untuk menggunakan
.*
tetapi[sS]*
atau[dD]*
dsb.Ini ialah perbezaan antara padanan tamak ungkapan biasa dan padanan tidak tamak:
Mod tamak: Apabila padanan boleh dilakukan, padankan terpanjang . Ungkapan tidak berakhir dengan
?
.Mod tidak tamak: Apabila pemadanan boleh dilakukan, padankan terpendek . Ungkapan berakhir dengan
?
.Sebagai contoh, rentetan
abcabcabc
, apabila saya ingin memadankan rentetan yang bermula dengana
dan berakhir denganc
, terdapat tiga padanan:abc
,abcabc
danabcabcabc
, antaranya yang paling Panjangabcabcabc
boleh dipadankan dengana.*c
, manakala yang terpendekabc
boleh dipadankan dengana.*?c
.Oleh kerana
.*
ialah corak tamak, ia akan sepadan dengan rentetan terpanjang di mana setiap aksara ialah sebarang aksara (.
), iaitu rentetan yang terdiri daripada semua aksara input. Dan.*?
ialah mod tidak tamak, yang akan sepadan dengan rentetan terpendek di mana setiap aksara ialah sebarang aksara (.
), iaitu rentetan kosong.Jika anda ingin memadankan perkataan kucing, anda harus menggunakan
cats
. Jika anda ingin memadankan perkataan pertama dalam rentetan input, anda harus menggunakanw
atauS
.Tidak, tetapi dalam ungkapan biasa, anda boleh menggunakan
^
untuk mewakili kedudukan permulaan rentetan dan$
untuk mewakili kedudukan penamat. Ambil perhatian bahawa kedua-dua aksara ini (^
dan$
) ialah simbol yang ditentukan oleh peraturan yang sepadan dan digunakan dalam rentetan peraturan yang anda tulis Ini tidak bermakna rentetan yang akan dipadankan mengandungi dua simbol ini.
tidak boleh dipadankan..
Pemadanan sempadan tidak menggunakan aksara dalam rentetan yang dipadankan, dan ia adalah mod tidak tamak, jadi rentetan