A reguláris kifejezések (regex) egy olyan minta-illesztési technika, amely lehetővé teszi a karakterláncok feldolgozását és ellenőrzését.
Mi a reguláris kifejezés?
Egy reguláris kifejezés egy olyan karakterlánc, amely egy mintát határoz meg, amelyet egy másik karakterláncban keresünk. A minta lehet egyszerű vagy összetett, és különböző karakterekből állhat.
Hogyan használjuk a reguláris kifejezéseket?
A reguláris kifejezéseket használhatjuk:
A reguláris kifejezések (regex) a Pythonban a karakterláncok keresésére, egyeztetésére és manipulálására szolgálnak, specifikus minták alapján. A Python egy ún. re modult biztosít, amely tartalmazza a reguláris kifejezésekkel való munkához szükséges funkciókat és metódusokat.
re modulban| Funkció | Magyarázat |
|---|---|
re.search(pattern, string) |
Match objektumot ad vissza, ha a karakterláncban bárhol talál egyezést. Ha egynél több egyezés van, akkor csak az első előfordulását adja vissza. Ha nem talált egyezést, akkor None értékkel tér vissza. |
re.findall(pattern, string) |
Egy listát ad vissza, amely tartalmazza az összes találatot. |
re.sub(pattern, repl, string) |
Kicseréli a minta előfordulásait a karakterláncban egy helyettesítő karakterláncra. |
re.split(pattern, string) |
Egy listát ad vissza, melybe felosztja a karakterláncot a minta előfordulásai alapján. |
| Minta | Magyarázat |
|---|---|
\d |
Bármely számjegyet (0-9) jelöl. |
\D |
Bármely nem számjegy karaktert jelöl. |
\w |
Bármely alfanumerikus karaktert (betűk és számok) és aláhúzást jelöl. |
\W |
Bármely nem alfanumerikus karaktert jelöl. |
\s |
Bármely szóköz karaktert (szóköz, tabulátor, új sor) jelöl. |
\S |
A \s tagadása. |
\b |
A szó elején vagy végén jelöli. |
. |
Bármely karaktert jelöl, kivéve az új sort. |
^ |
A karakterlánc elejét jelöli. |
$ |
A karakterlánc végét jelöli. |
* |
A megelőző elem 0 vagy több ismétlését jelöli. |
+ |
A megelőző elem 1 vagy több ismétlését jelöli. |
? |
A megelőző elem 0 vagy 1 ismétlését jelöli. |
{n} |
Pontosan n ismétlést jelöl a megelőző elemre. |
{n,} |
n vagy több ismétlést jelöl a megelőző elemre. |
{n,m} |
n és m közötti ismétlést jelöl a megelőző elemre. |
\| |
Logikai VAGY-ként működik. |
[] |
A zárójelben megadott karakterhalmaz egy elemének előfordulását jelöli. |
re modul használataimport re
# Minta karakterlánc
text = "Az Alföld egyre sivatagosabb."
# Keresés a "Alföld" szó után
match = re.search(r"Alföld", text)
if match :
print(f"Megtaláltam: {match.group()}")
# Minden olyan szót keres, ami 'a'-val kezdődik
matches = re.findall(r"\ba\w*", text)
print(f"A 'a'-val kezdődő szavak: {matches}")
# "Alföld" helyettesítése "Alpok"-ra
new_text = re.sub(r"Alföld", "Alpok", text)
print(f"Frissített szöveg: {new_text}")
# A szöveg felosztása szavakra
words = re.split(r"\s+", text)
print(f"Szavak a szövegben: {words}")
Megtalálva: Alföld
A 'a'-val kezdődő szavak: ['az', 'alföld']
Frissített szöveg: Az Alpok egyre sivatagosabb.
Szavak a szövegben: ['Az', 'Alföld', 'egyre', 'sivatagosabb'].
https://regex101.com/
import re
import unittest
def only_numbers(text):
return bool(re.match(r'^\d+$', text))
def only_letters(text):
return bool(re.match(r'^[a-zA-Z]+$', text))
def only_spaces(text):
return bool(re.match(r'^\s+$', text))
def date_validation(text):
return bool(re.match(r'^\d{4}-\d{2}-\d{2}$', text))
def phone_number_validation(text):
return bool(re.match(r'^06\d{8}$', text))
class TestFunctions(unittest.TestCase):
def test_only_numbers(self):
self.assertTrue(only_numbers('12345'))
self.assertFalse(only_numbers('abc'))
def test_only_letters(self):
self.assertTrue(only_letters('hello'))
self.assertFalse(only_letters('123'))
def test_only_spaces(self):
self.assertTrue(only_spaces(' '))
self.assertFalse(only_spaces('hello'))
def test_date_validation(self):
self.assertTrue(date_validation('2022-07-25'))
self.assertFalse(date_validation('abc'))
def test_phone_number_validation(self):
self.assertTrue(phone_number_validation('0612345678'))
self.assertFalse(phone_number_validation('abc'))
if __name__ == '__main__':
unittest.main()
Ebben az alkalmazásban öt függvény van megvalósítva:
csak_szamok: Ellenőrzi, hogy egy karakterlánc csak számokat tartalmaz-e.csak_betuk: Ellenőrzi, hogy egy karakterlánc csak betűket tartalmaz-e.csak_szokozok: Ellenőrzi, hogy egy karakterlánc csak szóközöket tartalmaz-e.datum_ellenorzes: Ellenőrzi, hogy egy karakterlánc egy dátumot tartalmaz-e a YYYY-MM-DD formátumban.telefonszam_ellenorzes: Ellenőrzi, hogy egy karakterlánc egy magyar telefonszámot tartalmaz-e a 06-os előhívóval.A unittest modul segítségével teszteljük ezeket a függvényeket. Az egyes tesztekben ellenőrizzük, hogy a függvények helyesen működnek-e.
Próbáljátok meg a legjobb tudásotok szerint megoldani a következő feladatokat python-ban és írjatok az elkészült függvényekre unittest-eket!
Az IMEI (International Mobile Equipment Identity) szám egy egyedi azonosító szám, amelyet a mobiltelefonok és más mobil eszközök használnak. Formai követelménye:
Magyar telefonszámok validálása, beleértve a mobil, budapesti és vidéki számokat.
Gondoljunk arra, hogy több keresztneve is lehet egy illetőnek és lehetnek benne rövid kötöszavak is, továbbá névelő tagokra is gondolni kell (dr., Dr., phd, prof., ifj., id., Mr, Mrs, Frau, Herr). Minden név tag nagybetűvel kezdődjön kivéve a kötöszavakat (von, de, la). Ügyeljünk rá, hogy keresztnevekből bármennyi lehet!