Carane nggunakake Python re modul expression re (cocog, search, sub, etc.)

Bisnis

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.

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
  • 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.

\1Tanda kurung pisanan
\2Kapindho kurung
\3Tanda 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

metakarakterisine
.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~nmbaleni
[]Sakumpulan karakter[]Cocog karo salah sawijining karakter kasebut
|UTAWAA|BCocog karo pola A utawa B
urutan khususisine
\dAngka desimal Unicode (diwatesi nomer ASCII kanthi gendera ASCII)
\D\dTegese kosok baline.
\sKarakter spasi putih Unicode (diwatesi kanggo karakter spasi putih ASCII kanthi gendera ASCII)
\S\sTegese kosok baline.
\wKarakter tembung lan garis bawah Unicode (diwatesi kanggo karakter alfanumerik ASCII lan garis ngisor kanthi gendera ASCII)
\W\wTegese 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

\wIki 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.IGNORECASEYen 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)
  • singkatanre.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.MULTILINEYen 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)
  • singkatanre.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.

Copied title and URL