Për të kryer përpunimin e shprehjeve të rregullta në Python, ne përdorim modulin re nga biblioteka standarde. Kjo ju lejon të nxirrni, zëvendësoni dhe ndani vargjet duke përdorur modele të shprehjes së rregullt.
- re — Regular expression operations — Python 3.10.0 Documentation
- Regular Expression HOWTO — Python 3.10.0 Documentation
Në këtë seksion, fillimisht do të shpjegojmë funksionet dhe metodat e modulit ri.
- Përpilimi i modeleve të shprehjes së rregullt:
compile()
- objekt ndeshjeje
- Kontrolloni nëse fillimi i vargut përputhet, nxirrni:
match()
- Kontrolloni për ndeshje që nuk kufizohen në fillim:
search()
- Kontrolloni nëse i gjithë vargu përputhet:
fullmatch()
- Merrni një listë të të gjitha pjesëve që përputhen:
findall()
- Merrni të gjitha pjesët që përputhen si një përsëritës:
finditer()
- Zëvendësoni pjesën që përputhet:
sub()
,subn()
- Ndarja e vargjeve me modele të shprehjes së rregullt:
split()
Pas kësaj, unë do të shpjegoj meta karakteret (karakteret speciale) dhe sekuencat e veçanta të shprehjeve të rregullta që mund të përdoren në modulin re. Në thelb, është sintaksa standarde e shprehjes së rregullt, por kini kujdes në lidhje me vendosjen e flamujve (veçanërisht re.ASCII).
- Metakaraktere të shprehjes së rregullt, sekuenca të veçanta dhe paralajmërime në Python
- Vendosja e flamurit
- I kufizuar në karaktere ASCII:
re.ASCII
- Jo i ndjeshëm ndaj rasteve:
re.IGNORECASE
- Përputhni fillimin dhe fundin e çdo rreshti:
re.MULTILINE
- Specifikoni disa flamuj
- I kufizuar në karaktere ASCII:
- Ndeshje të pangopura dhe jo të pangopura
- Përpiloni modelin e shprehjes së rregullt: compile()
- objekt ndeshjeje
- Kontrolloni nëse fillimi i një vargu përputhet, ekstraktoni: match()
- Kontrolloni për përputhje që nuk kufizohen në fillim, nxirrni: search()
- Kontrolloni nëse i gjithë vargu përputhet: fullmatch()
- Merrni një listë të të gjitha pjesëve që përputhen: findall()
- Merrni të gjitha pjesët që përputhen si një përsëritës: finditer()
- Zëvendësoni pjesët që përputhen: sub(), subn()
- Ndarja e vargjeve me modele të shprehjes së rregullt: split()
- Metakaraktere të shprehjes së rregullt, sekuenca të veçanta dhe paralajmërime në Python
- Vendosja e flamurit
- Ndeshje të pangopura dhe jo të pangopura
Përpiloni modelin e shprehjes së rregullt: compile()
Ekzistojnë dy mënyra për të kryer përpunimin e shprehjeve të rregullta në modulin re.
Drejtoni me funksion
E para është një funksion.re.match()
,re.sub()
Funksione si këto janë të disponueshme për të kryer nxjerrjen, zëvendësimin dhe procese të tjera duke përdorur modele të rregullta shprehjeje.
Detajet e funksioneve do të përshkruhen më vonë, por në të gjitha, argumenti i parë është vargu i modelit të shprehjes së rregullt, i ndjekur nga vargu që do të përpunohet e kështu me radhë. Për shembull, në re.sub(), e cila kryen zëvendësimin, argumenti i dytë është vargu i zëvendësimit dhe argumenti i tretë është vargu që do të përpunohet.
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
Vini re se [a-z] në modelin e shprehjes së rregullt në këtë shembull nënkupton çdo karakter nga a në z (d.m.th. alfabeti i vogël), dhe + do të thotë të përsërisni modelin e mëparshëm (në këtë rast [a-z]) një ose më shumë herë. [a-z]+ përputhet me çdo varg që përsërit një ose më shumë karaktere alfabetike të vogla.
. është një personazh meta (një personazh me domethënie të veçantë) dhe duhet t’i ikë me një vijë të prapme.
Meqenëse vargjet e modelit të shprehjes së rregullt shpesh përdorin shumë vija të pasme, është e përshtatshme të përdoren vargjet e papërpunuara si në shembull.
Ekzekutohet në një metodë të një objekti të modelit të shprehjes së rregullt
Mënyra e dytë për të përpunuar shprehjet e rregullta në modulin re është metoda e objektit të modelit të shprehjes së rregullt.
Duke përdorur re.compile(), mund të përpiloni një varg modeli të shprehjeve të rregullta për të krijuar një objekt të modelit të shprehjes së rregullt.
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()
Për shembull, i njëjti proces si këto funksione mund të ekzekutohet kur metodat përputhen (),sub() të objekteve të shprehjes së rregullt.
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
Të gjitha funksionet re.xxx() të përshkruara më poshtë ofrohen gjithashtu si metoda të objektit të shprehjes së rregullt.
Nëse po përsëritni një proces që përdor të njëjtin model, është më efikase të gjeneroni një objekt shprehjeje të rregullt me re.compile() dhe ta përdorni atë përreth.
Në kodin e mëposhtëm të mostrës, funksioni përdoret pa kompilim për lehtësi, por nëse dëshironi të përdorni të njëjtin model në mënyrë të përsëritur, rekomandohet ta përpiloni paraprakisht dhe ta ekzekutoni si metodë e një objekti të shprehjes së rregullt.
objekt ndeshjeje
match(), search(), etj. kthejnë një objekt përputhje.
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'>
Vargu dhe pozicioni i përputhur merren duke përdorur metodat e mëposhtme të objektit të përputhjes.
- Merrni vendndodhjen e ndeshjes:
start()
,end()
,span()
- Merrni vargun e përputhur:
group()
- Merrni vargun për secilin grup:
groups()
print(m.start())
# 0
print(m.end())
# 11
print(m.span())
# (0, 11)
print(m.group())
# aaa@xxx.com
Nëse vendosni një pjesë të një modeli të shprehjes së rregullt në një varg me kllapa(), pjesa do të përpunohet si grup. Në këtë rast, vargu i pjesës që përputhet me secilin grup në grupe() mund të merret si një 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')
Kontrolloni nëse fillimi i një vargu përputhet, ekstraktoni: match()
match() kthen një objekt përputhje nëse fillimi i vargut përputhet me modelin.
Siç u përmend më lart, objekti i përputhjes mund të përdoret për të nxjerrë nënvargun e përputhur, ose thjesht për të kontrolluar nëse është bërë një përputhje.
match() do të kontrollojë vetëm fillimin. Nëse nuk ka asnjë varg që përputhet në fillim, ai kthen Asnjë.
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
Kontrolloni për përputhje që nuk kufizohen në fillim, nxirrni: search()
Ashtu si match(), ai kthen një objekt përputhje nëse përputhet.
Nëse ka disa pjesë që përputhen, vetëm pjesa e parë që përputhet do të kthehet.
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'>
Nëse dëshironi të merrni të gjitha pjesët që përputhen, përdorni findall() ose finditer() siç përshkruhet më poshtë.
Kontrolloni nëse i gjithë vargu përputhet: fullmatch()
Për të kontrolluar nëse i gjithë vargu përputhet me modelin e shprehjes së rregullt, përdorni fullmatch(). Kjo është e dobishme, për shembull, për të kontrolluar nëse një varg është i vlefshëm si adresë emaili apo jo.
Nëse i gjithë vargu përputhet, kthehet një objekt përputhjeje.
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'>
Nëse ka pjesë të pakrahasueshme (vetëm ndeshje të pjesshme ose pa ndeshje fare), Asnjë nuk kthehet.
s = '!!!aaa@xxx.com!!!'
m = re.fullmatch(r'[a-z]+@[a-z]+\.com', s)
print(m)
# None
Fullmatch() u shtua në Python 3.4. Nëse dëshironi të bëni të njëjtën gjë në versionet e mëparshme, përdorni match() dhe një meta karakter që përputhet $ në fund. Nëse i gjithë vargu nga fillimi në fund nuk përputhet, ai kthen Asnjë.
s = '!!!aaa@xxx.com!!!'
m = re.match(r'[a-z]+@[a-z]+\.com$', s)
print(m)
# None
Merrni një listë të të gjitha pjesëve që përputhen: findall()
findall() kthen një listë të të gjitha nënvargjeve që përputhen. Vini re se elementet e listës nuk janë objekte të përputhjes, por vargje.
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']
Numri i pjesëve që përputhen mund të kontrollohet duke përdorur funksionin e integruar len(), i cili kthen numrin e elementeve në listë.
print(len(result))
# 3
Grupimi me kllapa() në një model shprehjeje të rregullt kthen një listë tuplesh, elementët e të cilëve janë vargjet e secilit grup. Kjo është e barabartë me grupet() në objektin e ndeshjes.
result = re.findall(r'([a-z]+)@([a-z]+)\.([a-z]+)', s)
print(result)
# [('aaa', 'xxx', 'com'), ('bbb', 'yyy', 'com'), ('ccc', 'zzz', 'net')]
Kllapat e grupit () mund të vendosen me fole, kështu që nëse dëshironi të merrni të gjithë ndeshjen gjithashtu, thjesht vendosni të gjithë ndeshjen në kllapa ().
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')]
Nëse nuk gjendet asnjë përputhje, kthehet një tuple bosh.
result = re.findall('[0-9]+', s)
print(result)
# []
Merrni të gjitha pjesët që përputhen si një përsëritës: finditer()
finditer() kthen të gjitha pjesët që përputhen si një përsëritës. Elementet nuk janë vargje si findall(), por përputhen me objekte, kështu që ju mund të merrni pozicionin (indeksin) e pjesëve të përputhura.
Vetë iteratori nuk mund të printohet me print() për të marrë përmbajtjen e tij. Nëse përdorni funksionin e integruar next() ose deklaratën for, mund t’i merrni përmbajtjet një nga një.
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'>
Mund të konvertohet gjithashtu në një listë me list().
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)
Nëse dëshironi të merrni pozicionin e të gjitha pjesëve që përputhen, shënimi i kuptimit të listës është më i përshtatshëm se list().
print([m.span() for m in re.finditer(r'[a-z]+@[a-z]+\.[a-z]+', s)])
# [(0, 11), (13, 24), (26, 37)]
Iteratori nxjerr elementet sipas renditjes. Vini re se nëse përpiqeni të nxirrni më shumë elementë pasi të keni arritur në fund, nuk do të mbeteni pa asgjë.
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))
# []
Zëvendësoni pjesët që përputhen: sub(), subn()
Duke përdorur sub(), mund të zëvendësoni pjesën e përputhur me një varg tjetër. Vargu i zëvendësuar do të kthehet.
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'>
Kur grupohet me kllapa(), vargu i përputhur mund të përdoret në vargun e zëvendësuar.
Si parazgjedhje, mbështetet sa vijon: Vini re se për vargjet normale që nuk janë vargje të papërpunuara, një vijë e prapme duhet të renditet përpara vijës së prapme për t’i shpëtuar vijës së prapme.
\1 | Paranteza e parë |
\2 | Paranteza e dytë |
\3 | Paranteza e tretë |
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>
Nëse e emërtoni grupin duke e shkruar këtë në fillim të kllapave të modelit të shprehjes së rregullt, mund ta specifikoni duke përdorur emrin në vend të numrit, siç tregohet më poshtë.\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
Numërimi i argumenteve specifikon numrin maksimal të zëvendësimeve. Vetëm numërimi nga ana e majtë do të zëvendësohet.
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() kthen një tufë të vargut të zëvendësuar (e njëjtë me vlerën e kthyer të sub()) dhe numrin e pjesëve të zëvendësuara (numrin që përputhej me modelin).
result = re.subn(r'[a-z]+@[a-z]+\.com', 'new-address', s)
print(result)
# ('new-address, new-address, ccc@zzz.net', 2)
Metoda e specifikimit të argumenteve është e njëjtë me sub(). Ju mund të përdorni pjesën e grupuar me kllapa, ose të specifikoni numrin e argumenteve.
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)
Ndarja e vargjeve me modele të shprehjes së rregullt: split()
split() ndan vargun në pjesën që përputhet me modelin dhe e kthen atë si një listë.
Vini re se ndeshjet e para dhe të fundit do të përmbajnë vargje boshe në fillim dhe në fund të listës që rezulton.
s = '111aaa222bbb333'
result = re.split('[a-z]+', s)
print(result)
# ['111', '222', '333']
result = re.split('[0-9]+', s)
print(result)
# ['', 'aaa', 'bbb', '']
Argumenti maxsplit specifikon numrin maksimal të ndarjeve (pjesëve). Vetëm numërimi nga ana e majtë do të ndahet.
result = re.split('[a-z]+', s, 1)
print(result)
# ['111', '222bbb333']
Metakaraktere të shprehjes së rregullt, sekuenca të veçanta dhe paralajmërime në Python
Meta karakteret kryesore të shprehjes së rregullt (karakteret speciale) dhe sekuencat speciale që mund të përdoren në modulin Python 3 re janë si më poshtë
metakarakter | përmbajtjen |
---|---|
. | Çdo karakter i vetëm përveç një rreshti të ri (duke përfshirë një rresht të ri me flamurin DOTALL) |
^ | Fillimi i vargut (gjithashtu përputhet me fillimin e çdo rreshti me flamurin MULTILINE) |
$ | Fundi i vargut (gjithashtu përputhet me fundin e çdo rreshti me flamurin MULTILINE) |
* | Përsëriteni modelin e mëparshëm më shumë se 0 herë |
+ | Përsëriteni modelin e mëparshëm të paktën një herë. |
? | Përsëriteni modelin e mëparshëm 0 ose 1 herë |
{m} | Përsëriteni modelin e mëparshëm m herë |
{m, n} | Modeli i fundit.m ~n përsëritni |
[] | Një grup personazhesh[] Përputhet me ndonjë nga këta personazhe |
| | OSEA|B Përputhet me modelin A ose B |
sekuencë e veçantë | përmbajtjen |
---|---|
\d | Numrat dhjetorë të Unicode (të kufizuara në numra ASCII nga flamuri ASCII) |
\D | \d Do të thotë e kundërta e kësaj. |
\s | Karakteret e hapësirës së bardhë Unicode (të kufizuara në karaktere të hapësirës së bardhë ASCII nga flamuri ASCII) |
\S | \s Do të thotë e kundërta e kësaj. |
\w | Karakteret dhe nënvizat e fjalëve Unicode (të kufizuara në karaktere alfanumerike ASCII dhe nënvizat sipas flamurit ASCII) |
\W | \w Do të thotë e kundërta e kësaj. |
Jo të gjithë janë renditur në këtë tabelë. Shihni dokumentacionin zyrtar për një listë të plotë.
Vini re gjithashtu se disa nga kuptimet janë të ndryshme në Python 2.
Vendosja e flamurit
Siç tregohet në tabelën e mësipërme, disa meta karaktere dhe sekuenca të veçanta ndryshojnë modalitetin e tyre në varësi të flamurit.
Këtu mbulohen vetëm flamujt kryesorë. Shihni dokumentacionin zyrtar për pjesën tjetër.
I kufizuar në karaktere ASCII: re.ASCII
\w
Kjo do të përputhet gjithashtu me kanji me dy bajt, karaktere alfanumerike, etj. si parazgjedhje për vargjet Python 3. Nuk është ekuivalente me sa vijon sepse nuk është një shprehje e rregullt standarde.[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
Nëse specifikoni re.ASCII për flamujt e argumentit në secilin funksion, ose shtoni flamurin e mëposhtëm në linjë në fillim të vargut të modelit të shprehjes së rregullt, ai do të përputhet vetëm me karakteret ASCII (nuk do të përputhet me karaktere japoneze me dy bajt, karaktere alfanumerike, etj. .).(?a)
Në këtë rast, dy të mëposhtmet janë ekuivalente.\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
E njëjta gjë vlen edhe kur përpilohet me re.compile(). Përdorni flamujt e argumenteve ose flamujt në linjë.
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 është gjithashtu i disponueshëm si formulari i shkurtër re. A. Mund të përdorni njërën ose tjetrën.
print(re.ASCII is re.A)
# True
\W, e kundërta e \W, ndikohet gjithashtu nga flamujt re.ASCII dhe 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'>
Ashtu si me \w, dy karakteret e mëposhtme përputhen si parazgjedhje me karakteret me një bajt dhe atë me dy bajt, por kufizohen në karaktere me një bajt nëse specifikohen flamujt re.ASCII ose inline.
- Përputhni numrat
\d
- Përputhet me një hapësirë boshe
\s
- Përputhet me jo-numrat
\D
- Përputhet me çdo jo hapësirë.
\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
Jo i ndjeshëm ndaj rasteve:re.IGNORECASE
Si parazgjedhje, është i ndjeshëm ndaj shkronjave të vogla. Për të përputhur të dyja, duhet të përfshini shkronja të mëdha dhe të vogla në model.
re.IGNORECASE
Nëse kjo është e specifikuar, do të përputhet në mënyrë të pandjeshme ndaj shkronjave të vogla. Ekuivalente me flamurin i në shprehjet e rregullta standarde.
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'>
Ju mund të përdorni më pak se ose të barabartë me.
- flamuri i linjës
(?i)
- shkurtim
re.I
Përputhni fillimin dhe fundin e çdo rreshti:re.MULTILINE
^
Karakteret meta në këtë shprehje të rregullt përputhen me fillimin e vargut.
Si parazgjedhje, vetëm fillimi i të gjithë vargut përputhet, por sa vijon do të përputhet gjithashtu me fillimin e çdo rreshti. Ekuivalente me flamurin m në shprehjet e rregullta standarde.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']
$
Përputhet me fundin e vargut. Si parazgjedhje, përputhet vetëm fundi i të gjithë vargut.re.MULTILINE
Nëse e specifikoni këtë, do të përputhet gjithashtu me fundin e çdo rreshti.
result = re.findall('[a-z]+$', s)
print(result)
# ['zzz']
result = re.findall('[a-z]+$', s, flags=re.MULTILINE)
print(result)
# ['xxx', 'yyy', 'zzz']
Ju mund të përdorni më pak se ose të barabartë me.
- flamuri i linjës
(?m)
- shkurtim
re.M
Specifikoni disa flamuj
|
Nëse dëshironi të aktivizoni disa flamuj në të njëjtën kohë, përdorni këtë. Në rastin e flamujve në linjë, çdo karakter duhet të pasohet nga një shkronjë siç tregohet më poshtë.(?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']
Ndeshje të pangopura dhe jo të pangopura
Ky është një problem i përgjithshëm me shprehjet e rregullta, jo vetëm një problem me Python, por unë do të shkruaj për të sepse ka tendencë të më futë në telashe.
Si parazgjedhje, më poshtë është një ndeshje e pangopur, e cila përputhet me vargun më të gjatë të mundshëm.
*
+
?
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
? pasi do të rezultojë në një ndeshje jo të pangopur, minimale, që përputhet me vargun më të shkurtër të mundshëm.
*?
+?
??
m = re.match(r'.+?com', s)
print(m)
# <re.Match object; span=(0, 11), match='aaa@xxx.com'>
print(m.group())
# aaa@xxx.com
Vini re se përputhja e paracaktuar e babëzitur mund të përputhet me vargje të papritura.