Szabályos kifejezés szintaxis¶
A szabályos kifejezés (vagy RE) megadja azon karakterláncok halmazát, amelyek megfelelnek neki; a modulban található funkciók segítségével ellenőrizhetjük, hogy egy adott karakterlánc megfelel-e egy adott szabályos kifejezésnek (vagy hogy egy adott szabályos kifejezés megfelel-e egy adott karakterláncnak, ami ugyanazt jelenti).
A szabályos kifejezések egymáshoz kapcsolhatók, hogy új szabályos kifejezéseket alkossanak; ha A és B mindkettő szabályos kifejezés, akkor az AB is szabályos kifejezés.Általában, ha egy p karakterlánc megfelel A-nak és egy másik q karakterlánc megfelel B-nek, akkor a pq karakterlánc megfelel az AB-nek. Ez akkor érvényes, hacsak A vagy B nem tartalmaz alacsony precedenciájú műveleteket; A és B közötti határfeltételeket; vagy számozott csoportreferenciákat. Így az összetett kifejezések könnyen felépíthetők egyszerűbbprimitív kifejezésekből, mint amilyenek az itt leírtak. A reguláris kifejezések elméletének és megvalósításának részleteiről a Friedl-könyvben vagy szinte bármelyik fordítóprogram-készítéssel foglalkozó tankönyvben olvashatunk.
A reguláris kifejezések formátumának rövid magyarázata következik. További információért és szelídebb bemutatásért tekintse meg a Regular Expression HOWTO-t.
A szabályos kifejezések speciális és közönséges karaktereket egyaránt tartalmazhatnak. A legtöbb közönséges karakter, mint például 'A'
, 'a'
vagy '0'
, a legegyszerűbb reguláris kifejezések; ezek egyszerűen önmagukkal egyeznek meg. A közönséges karakterek egymáshoz kapcsolhatók, így a last
megfelel a 'last'
karakterláncnak. (A szakasz további részében a RE-ket this special style
-ban írjuk, általában idézőjelek nélkül, az illesztendő karakterláncokat pedig 'in single quotes'
-ban.)
Egyes karakterek, mint a '|'
vagy a '('
, különlegesek. A speciális karakterek vagy a közönséges karakterek osztályait jelölik, vagy befolyásolják a körülöttük lévő reguláris kifejezések értelmezését.
A ismétlődő minősítők (*
, +
, ?
, {m,n}
, stb.) nem lehetnek közvetlenül egymásba ágyazva. Ezáltal elkerülhető a félreérthetőség a?
nem szűkszavú módosító utótaggal és más implementációk más módosítóival. Egy második ismétlés belső ismétléshez való alkalmazására zárójelek használhatók. Például a (?:a{6})*
kifejezés hat 'a'
karakter bármely többszörösére illeszkedik.
A speciális karakterek:
.
(Pont.) Az alapértelmezett módban ez minden karakterre illeszkedik, kivéve az újsorokat. Ha a DOTALL
jelzőt adtuk meg, ez minden karakterrel egyezik, beleértve az újsorokat is.
^
(Caret.) A karakterlánc elejére illeszkedik, és MULTILINE
módban közvetlenül minden újsor után is.
$
A karakterlánc végére vagy közvetlenül a karakterlánc végén lévő újsor előtt illeszkedik, és MULTILINE
módban az újsor előtt is. foo
megfelel a ‘foo’ és a ‘foobar’ kifejezésnek is, míg a foo$
reguláris kifejezés csak a ‘foo’-ra. Még érdekesebb, hogy a foo.$
keresése a 'foo1\nfoo2\n'
-ban normál esetben a ‘foo2’-t találja, de MULTILINE
módban a ‘foo1’-et; egyetlen $
keresése a 'foo\n'
-ban két (üres) találatot talál: egyet közvetlenül az újsor előtt, egyet pedig a karakterlánc végén.
*
Az eredményül kapott RE-t az előző RE 0 vagy több ismétlésével hozza össze, annyi ismétléssel, amennyi lehetséges. ab*
megfelel az ‘a’, ‘ab’, vagy ‘a’ és az azt követő tetszőleges számú ‘b’-nek.
+
Az eredményül kapott RE-t az előző RE 1 vagy több ismétlésével hozza összhangba.ab+
megfelel az ‘a’-nak, amelyet tetszőleges számú, nem nulla ‘b’-vel követ; csak az ‘a’-t nem hozza összhangba.
?
Az eredményül kapott RE az előző RE 0 vagy 1 ismétlésével egyezik meg.ab?
vagy ‘a’ vagy ‘ab’-val egyezik meg.
*?
,+?
,??
A '*'
, '+'
és '?'
minősítők mind mohók; a lehető legtöbb szöveggel egyeznek meg. Néha ez a viselkedés nem kívánatos; ha a RE<.*>
a '<a> b <c>'
-hez illeszkedik, akkor az egész sztringre illeszkedik, és nem csak a '<a>'
-re. A ?
hozzáadása a minősítő után nem mohó vagy minimális módon hajtja végre a megfeleltetést; a lehető legkevesebb karaktert fogja megfeleltetni. A RE <.*?>
használata csak a '<a>'
-nek felel meg.
{m}
Meghatározza, hogy az előző RE pontosan m másolatát kell megfeleltetni; a kevesebb karakter miatt a teljes RE nem felel meg. Például a a{6}
pontosan hat 'a'
karaktert fog megfeleltetni, de ötöt nem.
{m,n}
Az eredményül kapott RE-t az előzőRE m-től n ismétléséig terjedő számú ismétlésének megfeleltetésére készteti, megpróbálva a lehető legtöbb ismétlést megfeleltetni. Például a a{3,5}
3-5 'a'
karakterrel fog egyezni. Az m elhagyása nulla alsó korlátot, az n elhagyása pedig végtelen felső korlátot ad meg. Példaként a a{4,}b
megfelel a 'aaaab'
vagy ezer 'a'
karakternek, amelyet egy 'b'
követ, de a 'aaab'
nem. A vessző nem hagyható ki, különben a módosító összetéveszthető lenne a korábban leírt formával.
{m,n}?
Az eredményül kapott RE az előzőRE m-től n ismétléséig terjedő számú ismétléssel egyezik meg, a lehető legkevesebb ismétlésre törekedve. Ez az előző minősítő kíméletlen változata. Például a 6 karakterből álló 'aaaaaa'
karakterláncon a a{3,5}
5 'a'
karakterrel fog egyezni, míg a a{3,5}?
csak 3 karakterrel.
\
Elhagyja a speciális karaktereket (lehetővé téve az olyan karakterek egyezését, mint '*'
, '?'
és így tovább), vagy speciális szekvenciát jelez; a speciális szekvenciákat alább tárgyaljuk.
Ha nem nyers karakterláncot használsz a minta kifejezésére, ne feledd, hogy a Python a backslash-t is használja escape-szekvenciaként a string literálokban; ha az escapesequence-t nem ismeri fel a Python elemzője, akkor a backslash és az azt követő karakter bekerül a kapott karakterláncba. Ha azonban a Python felismeri az eredményül kapott szekvenciát, a backslash-t kétszer kell megismételni. Ezbonyolult és nehezen érthető, ezért erősen ajánlott, hogy a legegyszerűbb kifejezések kivételével minden más kifejezéshez használjon karakterláncokat.
Karakterkészlet jelölésére szolgál. Egy halmazban:
-
A karakterek egyenként is felsorolhatók, például a
megfelel a
'a'
,'m'
vagy'k'
karaktereknek.
-
Karakterek tartományai két karakter megadásával és a kettőt egy
'-'
-vel elválasztva adhatók meg, példáulbármely kisbetűs ASCII betűre megfelel,
az összes kétjegyű számra
00
-tól59
-ig, ésbármely hexadecimális számjegyre megfelel. Ha az
-
kikerül (pl.), vagy ha első vagy utolsó karakterként van elhelyezve(pl.
vagy
), akkor egyezni fog egy szó szerinti
'-'
-vel. -
A speciális karakterek elveszítik speciális jelentésüket a halmazokon belül. Például a
a
'('
,'+'
,'*'
vagy')'
szó szerinti karakterek bármelyikével megegyezik.
-
Az olyan karakterosztályok, mint a
\w
vagy\S
(alább definiálva) szintén elfogadottak egy készleten belül, bár az, hogy mely karakterekkel egyeznek meg, attól függ, hogy aASCII
vagyLOCALE
mód van-e érvényben.
-
A tartományon kívüli karakterek a halmaz kiegészítésével illeszthetők. Ha a halmaz első karaktere
'^'
, akkor az összes olyan karakter, amely nem szerepel a halmazban, illeszkedik. Például aminden karakterrel megegyezik, kivéve a
'5'
karaktert, és aminden karakterrel megegyezik, kivéve a
'^'
karaktert. A^
-nek nincs különleges jelentése, ha nem ez az első karakter a halmazban. -
Ha egy halmazon belül egy szó szerinti
']'
karakterrel akarunk megegyezni, állítsunk elé egy backslash-t, vagy helyezzük a halmaz elejére. Például a{}]
és a()
is megfelel egy zárójelnek.
-
Az Unicode TechnicalStandard #18-ban szereplő beágyazott halmazok és halmazműveletek támogatása a jövőben kiegészülhet. Ez megváltoztatná a szintaxist, ezért a változtatás megkönnyítése érdekében egyelőre egy
FutureWarning
-at fog felemelni a kétértelmű esetekben.Ez magában foglalja a szó szerinti'
-vel kezdődő halmazokat.(...)
Talál bármilyen reguláris kifejezést a zárójelek között, és jelzi a csoport kezdetét és végét; a csoport tartalma a találat elvégzése után is visszakereshető, és a karakterláncban később a lentebb ismertetett
\number
speciális szekvenciával illeszthető. A'('
vagy')'
literálok illesztéséhez használjuk a\(
vagy\)
jelet, vagy zárjuk be őket egy karakterosztályba:,
.
(?...)
Ez egy kiterjesztő jelölés (a
'('
után következő'?'
egyébként nem értelmezhető). A'?'
utáni első karakter határozza meg a konstrukció jelentését és további szintaxisát. A kiterjesztések általában nem hoznak létre új csoportot; a(?P<name>...)
az egyetlen kivétel ez alól. A következők a jelenleg támogatott kiterjesztések.(?aiLmsux)
(Egy vagy több betű a
'a'
,'i'
,'L'
,'m'
,'s'
, ,'x'
halmazból). A csoport az üres karakterlánccal egyezik meg; a betűk a megfelelő jelzőket állítják be:re.A
(csak ASCII-illesztés),re.I
(a nagy- és kisbetűket figyelmen kívül hagyja),re.L
(nyelvterületfüggő),re.M
(többsoros),re.S
(pont illeszkedik mindenre),re.U
(Unicode illesztés), ésre.X
(szóbeli),a teljes reguláris kifejezésre.(A zászlók a modul tartalmában vannak leírva.)Ez akkor hasznos, ha a zászlókat a reguláris kifejezés részeként akarjuk megadni, ahelyett, hogy egy zászló argumentumot adnánk át are.compile()
függvénynek. A zászlókat először a kifejezés karakterláncában kell használni.(?:...)
A szabályos zárójelek nem rögzítő változata. Bármilyen szabályos kifejezést illeszt a zárójelen belül, de a csoport által illesztett részláncot nem lehet visszakeresni az illesztés végrehajtása után, vagy a mintában később hivatkozni rá.
(?aiLmsux-imsx:...)
(Nulla vagy több betű a
'a'
,'i'
,'L'
,'m'
,'s'
,'u'
,'x'
halmazból, amelyet opcionálisan'-'
követ, majd egy vagy több betű a'i'
,'m'
,'s'
,'x'
halmazból.)A betűk beállítják vagy eltávolítják a megfelelő jelzőket:re.A
(csak ASCII-illesztés),re.I
(nagy- és kisbetűk figyelmen kívül hagyása),re.L
(helyfüggő),re.M
(többsoros),re.S
(pont illeszkedik mindenre),re.U
(Unicode illesztés),ésre.X
(bőbeszédű), a kifejezés adott részére.(A zászlók leírása a modul tartalmában található.)A
'a'
,'L'
és'u'
betűk kölcsönösen kizárják egymást, ha inline zászlóként használják őket, így nem kombinálhatók, és nem követhetik a'-'
-et. Ehelyett, amikor valamelyikük megjelenik egy inline csoportban, felülbírálja az illeszkedési módot a körülvevő csoportban. Unicode mintákban a(?a:...)
csakASCII megfeleltetésre vált, a(?u:...)
pedig Unicode megfeleltetésre vált (alapértelmezett). Bájtmintában(?L:...)
a helytől függő megfeleltetésre vált, és(?a:...)
a csak ASCII megfeleltetésre vált (alapértelmezett).Ez a felülbírálat csak a szűk soron belüli csoportra érvényes, és a csoporton kívül visszaáll az eredeti megfeleltetési mód.Új a 3. verzióban.6.
Változott a 3.7-es verzióban: A
'a'
,'L'
és'u'
betűk is használhatók a csoportban.(?P<name>...)
Hasonló a szabályos zárójelekhez, de a csoport által illesztett részlánc a szimbolikus csoportnévnévvel érhető el. A csoportneveknek érvényesPython azonosítóknak kell lenniük, és minden csoportnevet csak egyszer lehet definiálni aszokásos kifejezésen belül. A szimbolikus csoport is számozott csoport, ugyanúgy, mintha a csoport nem lenne elnevezve.
A megnevezett csoportokra három kontextusban lehet hivatkozni. Ha a minta
(?P<quote>).*?(?P=quote)
(azaz. egy szimpla vagy dupla idézőjelbe tett karakterláncra illeszkedik):Az “idézet”
csoportra való hivatkozás kontextusa
magában a mintában
- .
-
(?P=quote)
(mint látható) -
az m
-
m.group('quote')
-
m.end('quote')
megfelelő objektum feldolgozásakor (stb.)
a
re.sub()
-
\g<quote>
-
\g<1>
-
replargumentumának átadott stringben.
(?P=name)
A backreference to a named group; Megegyezik azzal a szöveggel, amire a korábbi csoport neve megfelelt.
(?#...)
Egy megjegyzés; a zárójelek tartalmát egyszerűen figyelmen kívül hagyja.
(?=...)
Megfelel, ha a
...
megfelel a következőnek, de nem fogyaszt el semmit a karakterláncból. Ezt lookahead állításnak nevezzük. Például aIsaac (?=Asimov)
csak akkor illeszkedik a'Isaac '
-hez, ha utána'Asimov'
következik.(?!...)
Talál, ha a
...
nem illeszkedik a következőhöz. Ez egy negatív lookahead állítás.Például aIsaac (?!Asimov)
csak akkor egyezik a'Isaac '
-vel, ha nem követi'Asimov'
.(?<=...)
Egyezik, ha a karakterlánc aktuális pozícióját megelőzi a
...
egyezése, amely az aktuális pozícióban végződik. Ezt pozitív lookbehindassertionnak nevezzük. A(?<=abc)def
talál egyezést a'abcdef'
-ben, mivel a lookbehind 3 karakterrel hátrébb megy, és ellenőrzi, hogy a benne lévő minta egyezik-e. A benne lévő minta csak bizonyos fix hosszúságú karakterláncokra illeszkedhet, ami azt jelenti, hogy aabc
vagy aa|b
megengedett, de aa*
és aa{3,4}
nem. Vegye figyelembe, hogy a pozitív lookbehind állítással kezdődő minták nem fognak a keresett karakterlánc elején egyezni; valószínűleg amatch()
függvény helyett asearch()
függvényt kell használni:>>> import re>>> m = re.search('(?<=abc)def', 'abcdef')>>> m.group(0)'def'
Ez a példa egy kötőjelet követő szót keres:
>>> m = re.search(r'(?<=-)\w+', 'spam-egg')>>> m.group(0)'egg'
Változott a 3. verzióban.5: Hozzáadta a rögzített hosszúságú csoporthivatkozások támogatását.
(?<!...)
Megfelel, ha a karakterlánc aktuális pozícióját nem előzi meg a
...
megfelelője. Ezt negatív lookbehind állításnak nevezzük. Hasonlóan a pozitív lookbehind állításokhoz, a benne lévő mintának csak bizonyos meghatározott hosszúságú karakterláncokra kell illeszkednie. A negatív lookbehind állítással kezdődő minták a keresett karakterlánc elején is egyezhetnek.(?(id/name)yes-pattern|no-pattern)
Megpróbál egyezni a
yes-pattern
-vel, ha a megadott azonosítóval vagy névvel rendelkező csoport létezik, és ano-pattern
-mal, ha nem. Ano-pattern
opcionális és elhagyható. Például a(<)?(\w+@\w+(?:\.\w+)+)(?(1)>|$)
egy gyenge e-mail megfeleltetési minta, amely megfelel a'<[email protected]>'
-nak és a'[email protected]'
-nak is, de a'<[email protected]'
-nak és a'[email protected]>'
-nek nem.A speciális szekvenciák a
'\'
és egy karakter az alábbi listából állnak.Ha a közönséges karakter nem ASCII számjegy vagy ASCII betű, akkor az eredmény RE a második karakterrel fog megegyezni. Például a$
megegyezik a'$'
karakterrel.\number
Egyezik az azonos számú csoport tartalmával. A csoportok számozása 1-től kezdődik. Például a
(.+)
megfelel a'the the'
vagy a'55 55'
, de a'thethe'
nem (figyeljük meg a szóközt a csoport után). Ez a speciális szekvencia csak az első 99 csoport egyikének megfeleltetésére használható. Ha a szám első számjegye 0, vagy a szám 3 nyolcjegyű, akkor nem csoportillesztésként, hanem a szám nyolcjegyű karakterként értelmeződik. A''
karakterosztályon belül minden számkíséretet karakterként kezel.\A
Csak a karakterlánc elején.
\b
Csak az üres karakterláncot, de csak a szó elején vagy végén.A szó a szó karakterek sorozataként van definiálva. Megjegyzendő, hogy formálisan a
\b
a\w
és a\W
karakterek (vagy fordítva), illetve a\w
és a karakterlánc eleje/vége közötti határt jelenti.Ez azt jelenti, hogy ar'\bfoo\b'
megfelel a'foo'
,'foo.'
,'(foo)'
,'bar foo baz'
, de a'foobar'
vagy'foo3'
nem.Alapértelmezés szerint a Unicode alfanumerikus karakterek az Unicode mintákban használtak, de ez megváltoztatható a
ASCII
flag használatával. A szóhatárokat az aktuális nyelvterület határozza meg, ha aLOCALE
flaget használjuk.Egy karaktertartományon belül a\b
a backspace karaktert jelenti, a Python string literálokkal való kompatibilitás érdekében.\B
Talál az üres karakterláncot, de csak akkor, ha az nem egy szó elején vagy végén van. Ez azt jelenti, hogy a
r'py\B'
megfelel a'python'
,'py3'
,'py2'
, de a'py'
,'py.'
vagy'py!'
nem.A\B
éppen az ellenkezője a\b
-nek, így az Unicodepatternekben a szó karakterei Unicode alfanumerikus karakterek vagy az aláhúzás, bár ez megváltoztatható aASCII
flag használatával. A szóhatárokat aLOCALE
jelző használata esetén az aktuális nyelvterület határozza meg.\d
Unicode (str) mintákhoz:Talál bármely Unicode tizedesjegyet (azaz bármely karaktert az Unicode karakterkategóriában ). Ez magában foglalja a
, és sok más számjegyet is. A
ASCII
jelző használata esetén csak ailleszkedik.
8 bites (bytes) mintákhoz:
Talál bármilyen tizedesjegyet; ez egyenértékű a
-vel.
\D
Talál bármilyen karaktert, amely nem tizedesjegy. Ez a
\d
ellentéte. Ha aASCII
jelzőt használjuk, akkor ez a.
\s
Unicode (str) mintákhoz egyenértékű lesz:Elhelyezi a Unicode szóköz karaktereket (ide tartozik a
, és sok más karakter is, például a sok nyelvben a tipográfiai szabályok által előírt szóközök). Ha a
ASCII
jelzőt használjuk, csak ailleszkedik.
8 bites (bájt) mintákhoz:
Az ASCII-karakterkészletben szóköznek tekintett karaktereket illeszti; ez egyenértékű a
-vel.
\S
Minden olyan karaktert illeszt, amely nem szóköz. Ez a
\s
ellentéte. Ha aASCII
jelzőt használjuk, akkor ez a.
\w
Unicode (str) mintákhoz egyenértékű lesz:Unicode szó karaktereket illeszt; ez magában foglalja a legtöbb karaktert, amelyek bármely nyelvben egy szó részét képezhetik, valamint a számokat és az aláhúzást. A
ASCII
jelző használata esetén csak ailleszkedik.
8 bites (bytes) mintákhoz:
Az ASCII karakterkészletben alfanumerikusnak tekintett karaktereket illeszti; ez egyenértékű a
-vel. Ha a
LOCALE
jelzőt használjuk, akkor az aktuális nyelvi tartományban alfanumerikusnak tekintett karakterekkel és az aláhúzással egyezik meg.\W
Minden olyan karakterrel egyezik meg, amely nem szó karakter. Ez a
\w
ellentéte. Ha aASCII
jelzőt használjuk, akkor ez amegfelelője lesz. Ha a
LOCALE
jelzőt használjuk, akkor olyan karakterekre illeszkedik, amelyek nem alfanumerikusak az aktuális lokálisban, sem az aláhúzás.\Z
Kizárólag a karakterlánc végén illeszkedik.
A Python karakterlánc literálok által támogatott szabványos menekülőszekvenciák többségét a reguláris kifejezések elemzője is elfogadja:
\a \b \f \n\N \r \t \u\U \v \x \
(Vegyük észre, hogy a
\b
a szóhatárok jelölésére szolgál, és csak karakterosztályokon belül jelent “backspace”-t.)'\u'
,'\U'
és'\N'
menekülőszekvenciákat csak az Unicodepatternek ismerik fel. Bájtmintákban ezek hibák. Az ASCIIbetűk ismeretlen eszkópsorozatait jövőbeli használatra tartjuk fenn, és hibaként kezeljük.Oktális eszkópsorozatok korlátozott formában szerepelnek. Ha az első számjegy 0, vagy ha három nyolcjegyű számjegy van, akkor az nyolcjegyű menekülésnek minősül. Ellenkező esetben csoportos hivatkozásnak minősül. A karakterlánc literálokhoz hasonlóan a nyolcjegyű menekülések mindig legfeljebb három számjegy hosszúságúak.
Változott a 3.3-as verzióban: A
'\u'
és'\U'
menekülési szekvenciák hozzáadásra kerültek.Változott a 3.6-os verzióban: A
'\'
és egy ASCII betűből álló ismeretlen escape-ek mostantól hibát jelentenek.Változott a 3.8-as verzióban: A
'\N{name}'
menekülési szekvencia hozzáadásra került. A karakterlánc literálokhoz hasonlóan ez is a megnevezett Unicode karakterre (pl.'\N{EM DASH}'
) bővül. -