Kanggo nindakake Processing expression biasa ing Python, kita nggunakake modul re saka perpustakaan standar. Iku ngijini sampeyan kanggo extract, ngganti, lan pamisah strings nggunakake pola expression biasa.
- re — Regular expression operations — Python 3.10.0 Documentation
- Regular Expression HOWTO — Python 3.10.0 Documentation
Ing bagean iki, pisanan kita bakal nerangake fungsi lan cara saka modul re.
- Kompilasi pola ekspresi reguler:
compile()
- obyek sing cocog
- Priksa manawa wiwitan senar cocog, ekstrak:
match()
- Priksa pertandhingan sing ora diwatesi ing wiwitan:
search()
- Priksa manawa kabeh string cocog:
fullmatch()
- Entuk dhaptar kabeh bagean sing cocog:
findall()
- Entuk kabeh bagean sing cocog minangka iterator:
finditer()
- Ganti bagean sing cocog:
sub()
,subn()
- Pisah senar kanthi pola ekspresi reguler:
split()
Sawisé iku, aku bakal nerangake karakter meta (karakter khusus) lan urutan khusus ekspresi biasa sing bisa digunakake ing modul re. Sejatine, iku standar sintaksis expression biasa, nanging ati-ati bab nyetel panji (utamané re.ASCII).
- Metakarakter ekspresi reguler, urutan khusus, lan caveat ing Python
- Nyetel gendera
- Watesan kanggo karakter ASCII:
re.ASCII
- Ora sensitif huruf cilik:
re.IGNORECASE
- Cocokake wiwitan lan pungkasan saben baris:
re.MULTILINE
- Nemtokake sawetara gendera
- Watesan kanggo karakter ASCII:
- Tandhingan rakus lan ora rakus
- Kompilasi pola ekspresi reguler: compile()
- obyek sing cocog
- Priksa manawa wiwitan string cocog, ekstrak: match()
- Priksa pertandhingan sing ora diwatesi ing wiwitan, ekstrak: telusuran ()
- Priksa manawa kabeh string cocog: fullmatch()
- Entuk dhaptar kabeh bagean sing cocog: findall()
- Entuk kabeh bagean sing cocog minangka iterator: finditer()
- Ganti bagean sing cocog: sub(), subn()
- Pisah string kanthi pola ekspresi reguler: pamisah ()
- Metakarakter ekspresi reguler, urutan khusus, lan caveat ing Python
- Nyetel gendera
- Tandhingan rakus lan ora rakus
Kompilasi pola ekspresi reguler: compile()
Ana rong cara kanggo nindakake Processing expression biasa ing modul re.
Run karo fungsi
Sing pisanan yaiku fungsi.re.match()
,re.sub()
Fungsi kaya iki kasedhiya kanggo nindakake ekstraksi, panggantos, lan proses liyane nggunakake pola ekspresi reguler.
Rincian fungsi kasebut bakal diterangake mengko, nanging ing kabeh, argumen pisanan yaiku senar pola ekspresi reguler, banjur senar sing bakal diproses lan liya-liyane. Contone, ing re.sub (), sing nindakake substitusi, argumen kapindho yaiku string substitusi, lan argumen katelu minangka string sing bakal diproses.
import re
s = 'aaa@xxx.com, bbb@yyy.com, ccc@zzz.net'
m = re.match(r'([a-z]+)@([a-z]+)\.com', s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>
result = re.sub(r'([a-z]+)@([a-z]+)\.com', 'new-address', s)
print(result)
# new-address, new-address, ccc@zzz.net
Elinga yen [a-z] ing pola ekspresi reguler ing conto iki tegese karakter apa wae saka a nganti z (yaiku alfabet cilik), lan + tegese mbaleni pola sadurunge (ing kasus iki [a-z]) siji utawa luwih. [a-z]+ cocog karo senar sing mbaleni siji utawa luwih karakter alfabet cilik.
. minangka karakter meta (karakter kanthi makna khusus) lan kudu oncat nganggo garis miring.
Wiwit strings pola ekspresi reguler asring nggunakake akeh backslashes, iku trep kanggo nggunakake strings mentah kaya ing conto.
Mlaku ing metode obyek pola ekspresi reguler
Cara liya kanggo proses ekspresi reguler ing modul re punika cara obyek pola expression biasa.
Nggunakake re.compile (), sampeyan bisa ngumpulake string pola expression biasa kanggo nggawe obyek pola expression biasa.
p = re.compile(r'([a-z]+)@([a-z]+)\.com')
print(p)
# re.compile('([a-z]+)@([a-z]+)\\.com')
print(type(p))
# <class 're.Pattern'>
re.match()
,re.sub()
Contone, proses padha fungsi iki bisa kaleksanan minangka cara cocog (), sub () obyek expression biasa.
m = p.match(s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>
result = p.sub('new-address', s)
print(result)
# new-address, new-address, ccc@zzz.net
Kabeh re.xxx () fungsi diterangake ing ngisor iki uga kasedhiya minangka cara saka obyek expression biasa.
Yen sampeyan mbaleni proses sing nggunakake pola padha, iku luwih efisien a generate obyek expression biasa karo re.compile () lan nggunakake watara.
Ing kode conto ing ngisor iki, fungsi digunakake tanpa kompilasi kanggo penak, nanging yen sampeyan pengin nggunakake pola sing padha bola-bali, dianjurake kanggo ngumpulake ing advance lan nglakokaké minangka cara saka obyek expression biasa.
obyek sing cocog
cocog (), telusuran (), etc bali obyek cocog.
s = 'aaa@xxx.com'
m = re.match(r'[a-z]+@[a-z]+\.[a-z]+', s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>
print(type(m))
# <class 're.Match'>
String lan posisi sing cocog dipikolehi kanthi nggunakake metode obyek sing cocog.
- Entuk lokasi pertandingan:
start()
,end()
,span()
- Entuk string sing cocog:
group()
- Entuk string kanggo saben klompok:
groups()
print(m.start())
# 0
print(m.end())
# 11
print(m.span())
# (0, 11)
print(m.group())
# aaa@xxx.com
Yen sampeyan nyakup bagean saka pola ekspresi biasa ing senar kanthi kurung (), bagean kasebut bakal diproses minangka klompok. Ing kasus iki, senar saka bagean sing cocog karo saben klompok ing kelompok () bisa dijupuk minangka tuple.
m = re.match(r'([a-z]+)@([a-z]+)\.([a-z]+)', s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>
print(m.groups())
# ('aaa', 'xxx', 'com')
Priksa manawa wiwitan string cocog, ekstrak: match()
match () ngasilake obyek sing cocog yen wiwitan senar cocog karo pola kasebut.
Kaya sing kasebut ing ndhuwur, obyek sing cocog bisa digunakake kanggo ngekstrak substring sing cocog, utawa mung kanggo mriksa apa sing cocog.
match () mung bakal mriksa wiwitan. Yen ora ana senar sing cocog ing wiwitan, bakal ngasilake Ora Ana.
s = 'aaa@xxx.com, bbb@yyy.com, ccc@zzz.net'
m = re.match(r'[a-z]+@[a-z]+\.com', s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>
m = re.match(r'[a-z]+@[a-z]+\.net', s)
print(m)
# None
Priksa pertandhingan sing ora diwatesi ing wiwitan, ekstrak: telusuran ()
Kaya match (), ngasilake obyek sing cocog yen cocog.
Yen ana pirang-pirang bagean sing cocog, mung bagean sing cocog pisanan sing bakal bali.
s = 'aaa@xxx.com, bbb@yyy.com, ccc@zzz.net'
m = re.search(r'[a-z]+@[a-z]+\.net', s)
print(m)
# <re.Match object; span=(26, 37), match='ccc@zzz.net'>
m = re.search(r'[a-z]+@[a-z]+\.com', s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>
Yen sampeyan pengin njaluk kabeh bagean cocog, nggunakake findall () utawa finditer () minangka diterangake ing ngisor iki.
Priksa manawa kabeh string cocog: fullmatch()
Kanggo mriksa yen kabeh senar cocog karo pola ekspresi biasa, gunakake fullmatch (). Iki migunani, contone, kanggo mriksa apa string bener minangka alamat email utawa ora.
Yen kabeh senar cocog, obyek sing cocog bakal bali.
s = 'aaa@xxx.com'
m = re.fullmatch(r'[a-z]+@[a-z]+\.com', s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>
Yen ana bagean sing ora cocog (mung parsial sing cocog utawa ora ana sing cocog), Ora ana sing bali.
s = '!!!aaa@xxx.com!!!'
m = re.fullmatch(r'[a-z]+@[a-z]+\.com', s)
print(m)
# None
Fullmatch () ditambahake ing Python 3.4. Yen sampeyan pengin nglakoni sing padha ing versi sadurungé, gunakake match () lan karakter meta sing cocog $ ing pungkasan. Yen kabeh senar saka wiwitan nganti pungkasan ora cocog, ora ana maneh.
s = '!!!aaa@xxx.com!!!'
m = re.match(r'[a-z]+@[a-z]+\.com$', s)
print(m)
# None
Entuk dhaptar kabeh bagean sing cocog: findall()
findall () ngasilake dhaptar kabeh substrings sing cocog. Elinga yen unsur dhaptar ora cocog obyek nanging strings.
s = 'aaa@xxx.com, bbb@yyy.com, ccc@zzz.net'
result = re.findall(r'[a-z]+@[a-z]+\.[a-z]+', s)
print(result)
# ['aaa@xxx.com', 'bbb@yyy.com', 'ccc@zzz.net']
Jumlah bagean dicocogaké bisa dicenthang nggunakake dibangun ing fungsi len (), kang ngasilake nomer unsur ing dhaftar.
print(len(result))
# 3
Ngelompokake karo kurung () ing pola expression biasa ngasilake dhaptar tuples kang unsur strings saben klompok. Iki padha karo kelompok () ing obyek match.
result = re.findall(r'([a-z]+)@([a-z]+)\.([a-z]+)', s)
print(result)
# [('aaa', 'xxx', 'com'), ('bbb', 'yyy', 'com'), ('ccc', 'zzz', 'net')]
Klompok kurung () bisa nested, dadi yen sampeyan pengin njaluk kabeh pertandhingan uga, mung nyakup kabeh pertandhingan ing kurung ().
result = re.findall(r'(([a-z]+)@([a-z]+)\.([a-z]+))', s)
print(result)
# [('aaa@xxx.com', 'aaa', 'xxx', 'com'), ('bbb@yyy.com', 'bbb', 'yyy', 'com'), ('ccc@zzz.net', 'ccc', 'zzz', 'net')]
Yen ora ana sing cocog, tuple kosong bakal bali.
result = re.findall('[0-9]+', s)
print(result)
# []
Entuk kabeh bagean sing cocog minangka iterator: finditer()
finditer () ngasilake kabeh bagean sing cocog minangka iterator. Unsur ora strings kaya findall (), nanging cocog obyek, supaya sampeyan bisa njaluk posisi (indeks) saka bagean cocog.
Iterator dhewe ora bisa dicithak nganggo print () kanggo entuk isine. Yen sampeyan nggunakake fungsi dibangun ing sabanjuré () utawa kanggo statement, sampeyan bisa njaluk isi siji.
s = 'aaa@xxx.com, bbb@yyy.com, ccc@zzz.net'
result = re.finditer(r'[a-z]+@[a-z]+\.[a-z]+', s)
print(result)
# <callable_iterator object at 0x10b0efa90>
print(type(result))
# <class 'callable_iterator'>
for m in result:
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>
# <re.Match object; span=(13, 24), match='bbb@yyy.com'>
# <re.Match object; span=(26, 37), match='ccc@zzz.net'>
Uga bisa diowahi kanggo dhaftar karo dhaftar ().
l = list(re.finditer(r'[a-z]+@[a-z]+\.[a-z]+', s))
print(l)
# [<re.Match object; span=(0, 11), match='aaa@xxx.com'>, <re.Match object; span=(13, 24), match='bbb@yyy.com'>, <re.Match object; span=(26, 37), match='ccc@zzz.net'>]
print(l[0])
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>
print(type(l[0]))
# <class 're.Match'>
print(l[0].span())
# (0, 11)
Yen sampeyan pengin njaluk posisi kabeh bagean cocog, dhaftar pangerten notasi luwih trep saka dhaftar ().
print([m.span() for m in re.finditer(r'[a-z]+@[a-z]+\.[a-z]+', s)])
# [(0, 11), (13, 24), (26, 37)]
iterator njupuk metu unsur supaya. Elinga yen sampeyan nyoba kanggo extract liyane unsur sawise tekan mburi, sampeyan bakal kiwa karo apa-apa.
result = re.finditer(r'[a-z]+@[a-z]+\.[a-z]+', s)
for m in result:
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>
# <re.Match object; span=(13, 24), match='bbb@yyy.com'>
# <re.Match object; span=(26, 37), match='ccc@zzz.net'>
print(list(result))
# []
Ganti bagean sing cocog: sub(), subn()
Nggunakake sub (), sampeyan bisa ngganti bagean sing cocog karo senar liyane. String sing diganti bakal bali.
s = 'aaa@xxx.com, bbb@yyy.com, ccc@zzz.net'
result = re.sub(r'[a-z]+@[a-z]+\.com', 'new-address', s)
print(result)
# new-address, new-address, ccc@zzz.net
print(type(result))
# <class 'str'>
Nalika klompok karo kurung (), senar sing cocog bisa digunakake ing senar diganti.
Kanthi gawan, ing ngisor iki didhukung: Elinga yen kanggo strings normal sing ora strings mentahan, backslash kudu kadhaptar sadurunge backslash kanggo uwal backslash.
\1 | Tanda kurung pisanan |
\2 | Kapindho kurung |
\3 | Tanda kurung katelu |
result = re.sub(r'([a-z]+)@([a-z]+)\.com', r'\1@\2.net', s)
print(result)
# aaa@xxx.net, bbb@yyy.net, ccc@zzz.net
?P<xxx>
Yen sampeyan menehi jeneng grup kasebut kanthi nulis iki ing wiwitan kurung pola ekspresi reguler, sampeyan bisa nemtokake kanthi nggunakake jeneng tinimbang nomer, kaya sing ditampilake ing ngisor iki.\g<xxx>
result = re.sub(r'(?P<local>[a-z]+)@(?P<SLD>[a-z]+)\.com', r'\g<local>@\g<SLD>.net', s)
print(result)
# aaa@xxx.net, bbb@yyy.net, ccc@zzz.net
Cacah argumen nemtokake jumlah maksimum panggantos. Mung count saka sisih kiwa bakal diganti.
result = re.sub(r'[a-z]+@[a-z]+\.com', 'new-address', s, count=1)
print(result)
# new-address, bbb@yyy.com, ccc@zzz.net
subn () ngasilake tuple saka senar diganti (padha Nilai bali saka sub ()) lan nomer bagean diganti (nomer sing cocog pola).
result = re.subn(r'[a-z]+@[a-z]+\.com', 'new-address', s)
print(result)
# ('new-address, new-address, ccc@zzz.net', 2)
Cara nemtokake argumen padha karo sub(). Sampeyan bisa nggunakake bagean sing diklumpukake kanthi kurung, utawa nemtokake jumlah argumen.
result = re.subn(r'(?P<local>[a-z]+)@(?P<SLD>[a-z]+)\.com', r'\g<local>@\g<SLD>.net', s)
print(result)
# ('aaa@xxx.net, bbb@yyy.net, ccc@zzz.net', 2)
result = re.subn(r'[a-z]+@[a-z]+\.com', 'new-address', s, count=1)
print(result)
# ('new-address, bbb@yyy.com, ccc@zzz.net', 1)
Pisah string kanthi pola ekspresi reguler: pamisah ()
pamisah () pamisah senar ing bagean sing cocog pola, lan bali minangka dhaftar.
Elinga yen pertandhingan pisanan lan pungkasan bakal ngemot string kosong ing wiwitan lan pungkasan dhaptar asil.
s = '111aaa222bbb333'
result = re.split('[a-z]+', s)
print(result)
# ['111', '222', '333']
result = re.split('[0-9]+', s)
print(result)
# ['', 'aaa', 'bbb', '']
Argumentasi maxsplit nemtokake jumlah maksimum pamisah (potongan). Mung count saka sisih kiwa bakal dipérang.
result = re.split('[a-z]+', s, 1)
print(result)
# ['111', '222bbb333']
Metakarakter ekspresi reguler, urutan khusus, lan caveat ing Python
Ekspresi reguler utama meta karakter (karakter khusus) lan urutan khusus sing bisa digunakake ing Python 3 modul re minangka nderek
metakarakter | isine |
---|---|
. | Sembarang karakter siji liyane saka baris anyar (kalebu baris anyar karo gendéra DOTALL) |
^ | Wiwitan senar (uga cocog karo wiwitan saben baris karo gendéra MULTILINE) |
$ | Pungkasan senar (uga cocog karo pungkasan saben baris karo gendéra MULTILINE) |
* | Baleni pola sadurunge luwih saka 0 kaping |
+ | Baleni pola sadurunge paling sethithik sapisan. |
? | Baleni pola sadurunge 0 utawa 1 kaping |
{m} | Baleni pola sadurunge m kaping |
{m, n} | Pola pungkasan.m ~n mbaleni |
[] | Sakumpulan karakter[] Cocog karo salah sawijining karakter kasebut |
| | UTAWAA|B Cocog karo pola A utawa B |
urutan khusus | isine |
---|---|
\d | Angka desimal Unicode (diwatesi nomer ASCII kanthi gendera ASCII) |
\D | \d Tegese kosok baline. |
\s | Karakter spasi putih Unicode (diwatesi kanggo karakter spasi putih ASCII kanthi gendera ASCII) |
\S | \s Tegese kosok baline. |
\w | Karakter tembung lan garis bawah Unicode (diwatesi kanggo karakter alfanumerik ASCII lan garis ngisor kanthi gendera ASCII) |
\W | \w Tegese kosok baline. |
Ora kabeh mau kadhaptar ing tabel iki. Deleng dokumentasi resmi kanggo dhaptar lengkap.
Elinga uga sawetara makna beda ing Python 2.
Nyetel gendera
Kaya sing ditampilake ing tabel ing ndhuwur, sawetara karakter meta lan urutan khusus ngganti mode gumantung saka gendera.
Mung gendéra utama sing ditutupi ing kene. Deleng dokumentasi resmi kanggo liyane.
Diwatesi kanggo karakter ASCII: re.ASCII
\w
Iki uga bakal cocog karo kanji bait pindho, karakter alfanumerik, lan sapiturute minangka standar kanggo string Python 3. Ora padha karo ing ngisor iki amarga dudu ekspresi reguler standar.[a-zA-Z0-9_]
m = re.match(r'\w+', '漢字ABC123')
print(m)
# <re.Match object; span=(0, 11), match='漢字ABC123'>
m = re.match('[a-zA-Z0-9_]+', '漢字ABC123')
print(m)
# None
Yen sampeyan nemtokake re.ASCII kanggo panji argumen ing saben fungsi, utawa nambahake gendera inline ing ngisor iki ing wiwitan string pola ekspresi reguler, mung bakal cocog karo karakter ASCII (ora bakal cocog karo karakter Jepang, alfanumerik, lsp. .).(?a)
Ing kasus iki, loro ing ngisor iki padha.\w
#ERROR![a-zA-Z0-9_]
m = re.match(r'\w+', '漢字ABC123', flags=re.ASCII)
print(m)
# None
m = re.match(r'(?a)\w+', '漢字ABC123')
print(m)
# None
Padha ditrapake nalika ngumpulake karo re.compile (). Gunakake flag argumen utawa flag inline.
p = re.compile(r'\w+', flags=re.ASCII)
print(p)
# re.compile('\\w+', re.ASCII)
print(p.match('漢字ABC123'))
# None
p = re.compile(r'(?a)\w+')
print(p)
# re.compile('(?a)\\w+', re.ASCII)
print(p.match('漢字ABC123'))
# None
ASCII uga kasedhiya minangka re wangun singkat. A. Sampeyan bisa nggunakake salah siji.
print(re.ASCII is re.A)
# True
\W, ngelawan saka \W, uga kena pengaruh re.ASCII lan gendera inline.
m = re.match(r'\W+', '漢字ABC123')
print(m)
# None
m = re.match(r'\W+', '漢字ABC123', flags=re.ASCII)
print(m)
# <re.Match object; span=(0, 11), match='漢字ABC123'>
Kaya \w, loro ing ngisor iki cocog karo karakter siji-byte lan pindho-bait minangka standar, nanging diwatesi kanggo karakter siji-bait yen re.ASCII utawa gendéra inline ditemtokake.
- Cocokake nomer
\d
- Cocog karo papan kosong
\s
- Cocog karo non-nomer
\D
- Cocog sembarang non-spasi.
\S
m = re.match(r'\d+', '123')
print(m)
# <re.Match object; span=(0, 3), match='123'>
m = re.match(r'\d+', '123')
print(m)
# <re.Match object; span=(0, 3), match='123'>
m = re.match(r'\d+', '123', flags=re.ASCII)
print(m)
# <re.Match object; span=(0, 3), match='123'>
m = re.match(r'\d+', '123', flags=re.ASCII)
print(m)
# None
m = re.match(r'\s+', ' ') # full-width space
print(m)
# <re.Match object; span=(0, 1), match='\u3000'>
m = re.match(r'\s+', ' ', flags=re.ASCII)
print(m)
# None
Ora sensitif huruf cilik:re.IGNORECASE
Kanthi gawan, iku sensitif huruf cilik. Kanggo cocog karo loro, sampeyan kudu nyakup huruf gedhe lan huruf cilik ing pola kasebut.
re.IGNORECASE
Yen iki wis ditemtokake, bakal cocog cilik-insensitively. Setara karo gendera i ing ekspresi reguler standar.
m = re.match('[a-zA-Z]+', 'abcABC')
print(m)
# <re.Match object; span=(0, 6), match='abcABC'>
m = re.match('[a-z]+', 'abcABC', flags=re.IGNORECASE)
print(m)
# <re.Match object; span=(0, 6), match='abcABC'>
m = re.match('[A-Z]+', 'abcABC', flags=re.IGNORECASE)
print(m)
# <re.Match object; span=(0, 6), match='abcABC'>
Sampeyan bisa nggunakake kurang saka utawa padha karo.
- gendera inline
(?i)
- singkatan
re.I
Cocokake wiwitan lan pungkasan saben baris:re.MULTILINE
^
Karakter meta ing ekspresi reguler iki cocog karo wiwitan senar.
Kanthi gawan, mung wiwitan kabeh senar sing cocog, nanging ing ngisor iki bakal cocog karo wiwitan saben baris uga. Setara karo gendera m ing ekspresi reguler standar.re.MULTILINE
s = '''aaa-xxx
bbb-yyy
ccc-zzz'''
print(s)
# aaa-xxx
# bbb-yyy
# ccc-zzz
result = re.findall('[a-z]+', s)
print(result)
# ['aaa', 'xxx', 'bbb', 'yyy', 'ccc', 'zzz']
result = re.findall('^[a-z]+', s)
print(result)
# ['aaa']
result = re.findall('^[a-z]+', s, flags=re.MULTILINE)
print(result)
# ['aaa', 'bbb', 'ccc']
$
Cocog karo mburi senar. Kanthi gawan, mung mburi kabeh senar sing cocog.re.MULTILINE
Yen sampeyan nemtokake iki, iku uga bakal cocog pungkasan saben baris.
result = re.findall('[a-z]+$', s)
print(result)
# ['zzz']
result = re.findall('[a-z]+$', s, flags=re.MULTILINE)
print(result)
# ['xxx', 'yyy', 'zzz']
Sampeyan bisa nggunakake kurang saka utawa padha karo.
- gendera inline
(?m)
- singkatan
re.M
Nemtokake sawetara gendera
|
Yen sampeyan pengin ngaktifake sawetara panji bebarengan, gunakake iki. Ing kasus gendera inline, saben karakter kudu diterusake karo huruf kaya sing ditampilake ing ngisor iki.(?am)
s = '''aaa-xxx
漢漢漢-字字字
bbb-zzz'''
print(s)
# aaa-xxx
# 漢漢漢-字字字
# bbb-zzz
result = re.findall(r'^\w+', s, flags=re.M)
print(result)
# ['aaa', '漢漢漢', 'bbb']
result = re.findall(r'^\w+', s, flags=re.M | re.A)
print(result)
# ['aaa', 'bbb']
result = re.findall(r'(?am)^\w+', s)
print(result)
# ['aaa', 'bbb']
Tandhingan rakus lan ora rakus
Iki masalah umum karo ungkapan biasa, ora mung masalah karo Python, nanging aku bakal nulis bab iku amarga cenderung kanggo njaluk kula menyang alangan.
Kanthi gawan, ing ngisor iki minangka pertandhingan rakus, sing cocog karo senar paling dawa.
*
+
?
s = 'aaa@xxx.com, bbb@yyy.com'
m = re.match(r'.+com', s)
print(m)
# <re.Match object; span=(0, 24), match='aaa@xxx.com, bbb@yyy.com'>
print(m.group())
# aaa@xxx.com, bbb@yyy.com
Ing ? sawise iku bakal kasil non-mukus, match minimal, cocog senar paling cendhak bisa.
*?
+?
??
m = re.match(r'.+?com', s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>
print(m.group())
# aaa@xxx.com
Elinga yen pertandhingan rakus standar bisa uga cocog karo senar sing ora dikarepake.