Piton

Reguláris kifejezések Python 3 használatával

Reguláris kifejezések Python 3 használatával
A reguláris kifejezéseket gyakran úgy tekintik, hogy ez valóban homályos hieroglifasorozat, amelyet az ember általában az internetről másol és beilleszt a kódjába. Ez a titokzatos varázslat aztán megmutatja a varázslatos képességeket a minták megtalálására a szöveg húrjain belül, és ha szépen megkérdezzük, akkor még azt a szívességet is meg fogja tenni nekünk, hogy egy adott mintát egy sztringen belül valamivel szebbre cserélünk.

Például amikor URL-hez kezelőket ír (és Isten segítsen, ha a semmiből ír), akkor gyakran ugyanazt az eredményt szeretné megjeleníteni, függetlenül attól, hogy az URL-ben szerepel-e a '/'. E.g https: // példa.com / user / settings / és https: // példa.A com / user / settings mindkettő ugyanarra az oldalra mutat a '/' után. 

Azonban nem hagyhatja figyelmen kívül az összes perjelet, például:

  1. A „felhasználó” és a „beállítások”, e, „felhasználó / beállítások” közötti perjel.
  2. Ezenkívül figyelembe kell vennie az FQDN elején lévő „//” -t, majd a „https”.

Tehát előáll egy olyan szabály, mint például: „Hagyja figyelmen kívül az előjeleket és az üres helyet.”, És ha akarod, kódolhatod ezt a szabályt egy sor if-else utasítással. De ez elég nehézkessé válik. Megírhat egy cleanUrl () függvényt, amely ezt beillesztheti az Ön számára. De az univerzum hamarosan elkezd több görbületet dobni rád. Hamarosan megtalálhatja magát a cleanHeaders (), a processLog () stb. Vagy használhat reguláris kifejezést, amikor bármilyen típusú mintaillesztésre van szükség.

Normál IO és fájlok

Mielőtt rátérnénk a reguláris kifejezések részleteire, érdemes megemlíteni azt a modellt, amelyet a legtöbb rendszer a szövegfolyamokra alkalmaz. Itt egy rövid (hiányos) összefoglaló:

  1. A szöveg egy (egyetlen) karakterfolyamként kerül feldolgozásra.
  2. Ez az adatfolyam származhat Unicode vagy ASCII szövegű fájlból, vagy szabványos bemenetből (billentyűzet), vagy távoli hálózati kapcsolatból. Feldolgozás után, mondjuk egy regex szkript segítségével, a kimenet vagy fájlba, vagy hálózati adatfolyamba, vagy a standard kimenetbe megy (pl.g, konzol)
  3. A folyam egy vagy több vonalból áll. Minden sornak nulla vagy több karaktere van, amelyet új sor követ.

Az egyszerűség kedvéért azt akarom, hogy képzelje el, hogy egy fájl új vonalas karakterrel végződő sorokból áll. Ezt a fájlt külön sorokra (vagy karakterláncokra) bontjuk, mindegyik új sorral vagy normál karakterrel végződik (az utolsó sorhoz).

Regexek és húrok

A regexnek semmi köze nincs a fájlokhoz. Képzelje el fekete dobozként, amely bármilyen tetszőleges (véges) hosszúságú karakterláncot bevihet, és amint eléri a karakterlánc végét, akkor:

  1. Fogadja el a karakterláncot. Más szavakkal, a húr mérkőzések a reguláris kifejezés (regex).
  2. Utasítsa el a karakterláncot, i.e, a húr nem mérkőzés a reguláris kifejezés (regex).

A fekete doboz-y jellege ellenére még néhány korlátozást fűzök ehhez a machinációhoz. A regex sztringet olvas egymás után, balról jobbra, és egyszerre csak egy karaktert olvas. Tehát egy húr „LinuxHint” a következőképpen olvasható:

'L "i" n "u" x "H" i "n" t' [Balról jobbra]

Kezdjük egyszerűen

A regex legegyszerűbb típusa a „C” karakterlánc keresése és illesztése lenne. A reguláris kifejezés csak „C”. Egészen triviális. A Pythonban történő végrehajtáshoz először importálnia kell az újra modul a reguláris kifejezésekhez.

>>> import re

Ezután használjuk a re függvényt.keresés(minta, húr) hol minta rendszeres kifejezésünk és húr abban a bemeneti karakterláncban, amelyen belül a mintát keressük.

>>> re.keresés ('C', 'Ebben a mondatban szándékos C szerepel')

A függvény felveszi a „C” mintát, megkeresi a beviteli karakterláncban és kinyomtatja a helyet (span) ahol az említett minta található. A karaktersorozatnak ez a része, ez az alszöveg felel meg a reguláris kifejezésünknek. Ha nem található ilyen egyezés, akkor a kimenet a Egyik sem tárgy.

Hasonlóképpen kereshet a „reguláris kifejezés” mintára az alábbiak szerint:

>>> re.keresés („reguláris kifejezés”, „Rendszeres kifejezéseket használhatunk minták keresésére.”)

újra.keresés (), újra.egyezik () és újra.fullmatch ()

A re modul három hasznos funkciója:

1.  újra.keresés(minta, húr)

Ez visszaadja a mintának megfelelő alsztringet, amint azt fentebb láthattuk. Ha nincs találat, akkor Egyik sem visszatér. Ha több alsorozat felel meg egy adott mintának, csak az első előfordulást jelentik.

2.  újra.mérkőzés(minta, húr)

Ez a függvény megpróbálja egyeztetni a mellékelt mintát a karakterlánc elejétől. Ha valahol félúton szünetet észlel, visszatér Egyik sem.

Például,

>>> re.meccs ("Joh", "John Doe")

Ahol a „A nevem John Doe” karakterlánc nem egyezik, és ennélfogva Egyik sem visszatér.

>>> nyomtatás (re.meccs („Joh”, „A nevem John Doe”))
Egyik sem

3.  újra.fullmatch (minta, húr)

Ez szigorúbb, mint a fentiek, és megpróbálja megtalálni a minta pontos egyezését a karakterláncban, különben alapértelmezés szerint Egyik sem.

>>> nyomtatás (re.fullmatch ("Joh", "Joh"))

# Minden más nem lesz meccs

Csak a újra.keresés() funkciót a cikk további részében. Amikor azt mondom, hogy a regex elfogadja ezt a karakterláncot, ez azt jelenti, hogy athe újra.keresés() függvény talált egy megfelelő sztringet a bemeneti karakterláncban, és ezt adta vissza a helyett Egyik semtárgy.

Speciális karakterek

Az olyan reguláris kifejezések, mint a „John” és a „C”, nem sok hasznát veszik. Szükségünk van olyan speciális karakterekre, amelyek a reguláris kifejezések összefüggésében meghatározottak. Íme néhány példa:

    1. ^ - Ez egyezik a karakterlánc elejével. Például a '^ C' egyezik az összes karakterlánccal, amelyek C betűvel kezdődnek.
    2. $ - Ez egyezik a sor végével.
    3. . - A pont egy vagy több karaktert jelöl, kivéve az új sort.
    4. * - Ez nulla vagy annál több karaktert jelent az előzőekben. Tehát b * megfelel a b 0 vagy több előfordulásának. Az ab * csak az a, ab és a megegyezik
    5. + - Ez annak egy vagy több karakterére vonatkozik, ami megelőzte. Tehát a b + megfelel a b 1 vagy több előfordulásának. Az ab * csak az a, ab és a megegyezik
    6. \ - A visszavonást menekülési szekvenciaként használják a regexekben. Ezért azt szeretné, hogy egy reguláris kifejezés a dollár szimbólum szó szerinti jelenlétét keresse a sor vége helyett. A \ $ szabályos kifejezéssel írható.
    7. A göndör zárójelekkel megadható a kívánt ismétlések száma. Például az ab 10 mintájú minta azt a sztringet jelöli, amelyet a és 10b követ, majd megegyezik ezzel a mintával. Megadhat egy számtartományt is, például b 4,6 egyezik meg olyan b karakterláncokkal, amelyek egymás után 4-6 alkalommal ismétlődnek. A 4 vagy több ismétlés mintájához csak egy vessző szükséges, például b 4,
    8. Szögletes zárójelek és karakterek tartománya. A RE, mint a [0-9], bármely 0 és 9 közötti számjegy helyőrzőjeként működhet. Hasonlóképpen számjegyei is lehetnek egy és öt között [1-5], vagy bármilyen nagybetűvel megegyezhetnek [A-Z] vagy az ábécé bármely betűjével, függetlenül attól, hogy nagy vagy kisbetűsek [A-z].
      Például bármely pontosan tíz számjegyből álló karakterlánc megfelel a [0-9] 10 reguláris kifejezésnek, ami nagyon hasznos, ha telefonszámokat keres egy adott karakterláncban.
    9. Létrehozhat OR-szerű utasítást a | használatával karakter, ahol a reguláris kifejezés két vagy több reguláris kifejezésből áll, például A és B. Az A | B regex egyezés, ha a bemeneti karakterlánc vagy egyezik az A reguláris kifejezéssel, vagy B-vel.
    10. Különféle regexeket csoportosíthat. Például a regex (A | B) C megegyezik az AC és a regexekkel

Sokkal többet kell fedeznünk, de azt javasolnám, hogy tanuljon menet közben, ahelyett, hogy túlterhelné az agyát sok homályos szimbólummal és éles tokkal. Ha kétségei merülnek fel, a Python Docs nagy segítség, és most már elég sokat tud a dokumentumok egyszerű követéséhez.

Kezek a tapasztalatokról és a referenciákról

Ha látni szeretné regexének vizuális értelmezését, ellátogathat a Debuggex oldalra. Ez a webhely valós időben generálja a regex nézetét, és lehetővé teszi, hogy különböző beviteli karakterláncokkal tesztelje.

Ha többet szeretne megtudni a reguláris kifejezések elméleti aspektusáról, érdemes megnéznie Michael Sipser Bevezetés a számítás elméletébe első fejezetét. Nagyon könnyen követhető, és megmutatja a reguláris kifejezések fontosságát, mint maga a számítás alapvető fogalmát!

Vulkan Linux felhasználók számára
A grafikus kártyák minden új generációjával azt látjuk, hogy a játékfejlesztők átlépik a grafikus hűség határait, és egy lépéssel közelebb kerülnek a ...
OpenTTD vs Simutrans
Saját közlekedési szimuláció létrehozása szórakoztató, pihentető és rendkívül csábító lehet. Ezért meg kell győződnie arról, hogy a lehető legtöbb ját...
OpenTTD bemutató
Az OpenTTD az egyik legnépszerűbb üzleti szimulációs játék. Ebben a játékban létre kell hoznia egy csodálatos szállítási vállalkozást. Azonban kezdete...