Skip to content

Regex I

DonatasNoreika edited this page Sep 9, 2024 · 17 revisions

Regular expression arba regex yra simbolių seka, kurios pagalba kuriame paieškos tekste šablonus. Ši technika nėra išskirtinai susijusi su Python ar kuria kita kalba. Tuo pačiu tai yra greičiausias būdas sutikrinti, ar suvesta informacija atitinka standartus (pvz. email), surasti kažkokias atkarpas tekste ir pan pobūdžio užduotims vykdyti.

pythex.org - svetainė, kurioje galima praktikuotis, tikrinti savo regex šablonus. Pvz. įvedus vieną raidę a, regex išgaudo visas raides tikrinamame tekste.

Testinis tekstas:

Tarptautinės oro transporto asociacijos statistika rodo, kad vis daugėja incidentų, susijusių su nepaklusniais lėktuvo keleiviais. Naujausi turimi duomenys (2017 m.) rodo, kad nutinka vidutiniškai po vieną tokį įvykį per 1 053 skrydžius. 2016 metų duomenys pranešė apie vieną įvykį per 1 344 skrydžius.

a

įvedus žodį rodo, surandami visi žodžiai 'rodo':

rodo

regex'as turi savo sintaksę, kurios pagalba galime apsibrėžti pačias įvairiausias paieškos tekste užklausas.

  • \d skaičius
  • \D neskaičius
  • \s tuščias tarpas (whitespace) [ \t\n\r\f\v] (space, tab, newline, ir pan.)
  • \S ne tuščias tarpas - viskas, kas ne tarpas.
  • \w alphanumeric: [0-9a-zA-Z_] - skaičiai nuo 0 iki 9, didžiosios ir mažosios raidės A-Z, simbolis '_'. UTF simboliai nėra alphanumeric.
  • \W viskas, kas nėra prieš tai išvardintame punkte.
  • . bet koks simbolis išskyrus eilutės pabaigos simbolį

pabandykime tiesiog įvesti \w:

\w

Rezultate matome, kad išrinktos visos alphanumeric reikšmės. Deja, UTF-8 simboliai nepakliūna į šią kategoriją, todėl lietuviškos raidės neišgaudytos. Vėliau aptarsime, kaip šitą problemą apeiti. Tarpus galime išrankioti su \s, skaičius su \d. Jeigu norime išgaudyti ir tarpus ir skaičius, naudojame loginį 'arba' simbolį '|':

\s|\d

svarbi regex sintaksės dalis yra vadinami Quantifiers. Jų pagalba šablone nustatome, kiek kartų simbolis atsikartoja šablone:

  • + Vieną ar daugiau kartų
  • {x} Lygiai x kartų
  • {x,y} Nuo x iki y kartų
  • {x,} x arba daugiau kartų
  • * Nulį ar daugiau kartų
  • ? kartą, arba nei karto (optional)

Tarkime, iš duoto teksto norime ištraukti '(2017 m.)':

  • Panagrinėkime - ( ištraukia skliaustelį, kadangi skliaustelis regex'o sintaksėje turi paskirtį, prieš jį naudojame escape simbolį '\'.
  • Toliau turim \d+. Reiškia skaičius gali atsikartoti vieną ir daugiau kartų.
  • Paskui eina tarpas - \s.
  • raidei m pagauti panaudojome \w.
  • '.)' kombinacija yra du NE alphanumerical simboliai, tiesiog panaudojome \W{2}

Turėkite omenyje, kad nėra vieno varianto šiai užduočiai atlikti, galime naudoti, pvz. \W\d{4}\s?m\W{1,2}. Arba tiesiog \(2017 m\.\). Viskas priklauso nuo to ar ieškome daugiau šablono (pattern), ar konkrečios atkarpos.

Arba, tarkime mums prireikė visų keturženklių skaičių. Atkreipkite dėmesį, metai užrašomi be tarpo, pvz. 2017, o kiti keturženkliai su pvz. 1 034.

\d\s?\d{3}

Laužtiniai skliaustai naudojami simbolių, kurie priklauso juose nurodytai grupei, paieškai. Tarkime [A-Za-z0-9] išrinks didžiąsias raides, mažąsias raides ir skaičius nuo 0 iki 9. [ąčęėįšųūž] išrankios lietuviškas raides, o, pvz, [\wąčęėįšųūž]+ išrinks visus žodžius ir skaičius lietuviškame tekste. (iš tiesų, Python'e paprasčiau su unicode simboliais, o šiame puslapyje geriau su angliškais tekstais praktikuotis).

Dar šiek tiek sintaksės:

  • ^ - ieško šablono tik iš eilutės pradžios (* Naudojamas laužtiniuose skliaustuose turi reikšmę NOT)
  • $ - ieško šablono tik iš eilutės pabaigos
  • \b - žodžio ribos simbolis

Pvz.:

Šiuo atveju mūsų regex'as pasigauna abudu keturženklius. Jeigu mes norėtumėm, kad pasigautų tik pirmąjį, kuris nesiriboja su kitais simboliais, prieš ir po naudotumėm \b:

Jeigu mums prireiktų atkarpos 'blablabla', tai tiesiog suvedus tai į šabloną, mums išrinks visas blablabla. Tačiau, prireikus tokios, kuri nesiriboja su jokiais kitais žodžiais, reikia daryti taip:

Jeigu mus domina žodis, kuriuo prasideda eilutė, rašome taip:

O simbolių kombinacijas eilutės pabaigoje išrenkame taip:

Paskutinė sintaksės porcija:

  • | - loginis 'arba'
  • () - grupavimas

Pvz.:

Panagrinėkime šabloną (Mr.|Mrs.)\s([A-Z\w]+\s[A-Z\w]+):

  • (Mr.|Mrs.) - ieško Mr. ARBA Mrs. Vienas iš dviejų.
  • \s - tarpas
  • ([A-Z]\w+\s[A-Z]\w+) - Ieško dviejų žodžių, prasidedančių didžiąja raide, atskirtų vienu tarpu.

paveikslėlyje atkreipkite dėmesį į Match Captures skiltį. Matome, kad rezultatas išskirstytas į grupes, t.y. 1. kreipinys 2. Vardas Pavardė, nes jos išskirtos skliausteliuose. Programuojant Python aplinkoje galėsime skirstyti užklausos rezultatus pagal grupes.

Dekoratoriai

Iteratoriai ir generatoriai

RegEx

Pillow

Email

NumPy

Pandas

Seaborn

Mašininis mokymasis

Requests, JSON, API

Web Scraping (Beautiful Soup)

Duomenų bazės

Flask

Django

Django REST

Odoo

Linux

Pabaigimo užduotis: savo programos kūrimas

Clone this wiki locally