Reguláris kifejezések

Mintaillesztésrõl van szó. Szeretnénk olyan kifejezéseket gyártani, amik különbözõ stringekre igazak, követve valamilyen mintát. Például valid emailcímek.

Építõelemek:

. (pont) – bármely, kivéve az új sor karakter

^ (kalap jel) – a minta kezdete

$ (dollár jel) – a minta vége

| (pipa) – logikai elágazás, előtte vagy utána levő kifejezés

[] (szögletes zárójel) – karakter osztály, a szögletes zárójelek közötti karakterek valamelyikeire bármilyen sorrendben illeszkedik

() (kerek zárójel) – csoportosítás, a kerek zárójelek közötti karakterekre pontos sorrendben illeszkedik

[^ab@] (tagadás a karakter osztályban) – bármi, kivéve a, b vagy @

[0-6] (karakter osztály tartomány) – 0 és 6 közötti számokra illeszkedik

[a-fA-F] (karakter osztály tartomány) – ASCII kis és nagy betűkre illeszkedik a-tól f-ig

Ismétlések

* (csillag) – a minta 0 vagy többszöri ismétlése

+ (plusz) – a minta 1 vagy többszöri ismétlése

? (kérdőjel) – a minta 0 vagy egyszeri ismétlése

{3} (intervallum) – a mintában pontosan három karakter lehet

{3,} (intervallum) – a mintában legalább három vagy több karakter lehet

{,3} (intervallum) – a mintában legfeljebb három karakter lehet

{1,4} (intervallum) – a mintában legalább egy, legfeljebb négy karakter lehet

Általános karakter osztályok

\d decimális szám

\D nem decimális szám, minden más

\s szóköz karakter

\S bármely más karakter a szóközön kívül

\w bármely szó

\W bármi, ami nem szó

Escape-elés:

Itt is mint korábban, ha pl . (pont)-ot akarunk írni akkor fordított per jellel kell escape-elni:

\.

Példák

Néggyel osztható 2 jegyû számok:

[02468][048]|[13579][26]

Email (nem tökéletes):

\W+@\W+\.\W+

Bármely lebegõpontos szám:

^[+-]?(\d+(\.\d+)?|\.\d+)([eE][+-]?\d+)?$

Nagy betűkkel írt római számok:

M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})

Feladat

Hexadecimális színkód

3 darab hexadecimális szám egymás után pl:

A34DC8

Évszám

yyyy-mm-dd formátumban

Reguláris kifejezések pythonban

Elõször be kell töltenünk a re csomagot, mely tartalmazza a python regexp függvényeit:

In [1]:
import re

Majd a findall függvénnyel megkereshetünk egy stringben minden elõfordulását a mintának:

In [2]:
pattern = r'[0-9]+\s[a-z]+'
string = "volt egyszer 25 kiskutya, elmentek a 13 varosba"
print(re.findall(pattern, string))
['25 kiskutya', '13 varosba']

Nézzük még meg hogyan tudunk lecserélni megtalált részeket stringekben:

In [4]:
mit = r'[0-9]+\s[a-z]+'
mire = r'12 majom'
miben = "volt egyszer 25 kiskutya, elmentek a 13 varosba"
print(re.sub(mit, mire, miben))
volt egyszer 12 majom, elmentek a 12 majom

Most kicsit bonyolultabban \1-el hivatkozok a () zárójelek közt megtalált részre:

In [6]:
mit = r'[0-9]+\s([a-z]+)'
mire = r'12 \1'
miben = "volt egyszer 25 kiskutya, elmentek a 13 varosba"
print(re.sub(mit, mire, miben))
volt egyszer 12 kiskutya, elmentek a 12 varosba

Ha több dologra is szeretnénk hivatkozni, akkor \2 a második és így tovább:

In [7]:
mit = r'([0-9]+)\s([a-z]+)'
mire = r'majdnem \1 \2'
miben = "volt egyszer 25 kiskutya, elmentek a 13 varosba"
print(re.sub(mit, mire, miben))
volt egyszer majdnem 25 kiskutya, elmentek a majdnem 13 varosba
In [ ]: